如果从 shell 启动,则 PostgreSQL 上的 QuerySet 上的 Django UnicodeEncodeError 会额外出现
大家好 我在两台机器上使用 Django 1.2.5 和 Python 2.6:Ubuntu 11.04 和 Debian Lenny。第一个是我的本地开发人员,第二个是远程服务器。我使用 django-fts 和 postgresql (数据库是远程的并且对于这两种安装都是唯一的)来进行全文搜索查询。有趣的是我可以在本地机器上使用俄语符号进行 fts 查询。在远程服务器上,它在评估我的额外内容时给了我 UnicodeEncodeError 。
在 django-fts postgre 后端中,我找到了这段代码:
ts_query = "plainto_tsquery('%s','%s')" % (self.language, unicode(query).replace("'", "''"))
where = '%s @@ %s' % (qn(self.vector_field.column), ts_query)
select = {}
order = []
if rank_field is not None:
select[rank_field] = 'ts_rank(%s.%s, %s, %d)' % (qn(self.model._meta.db_table), qn(self.vector_field.column), ts_query, rank_normalization)
order = ['-%s' % rank_field]
return qs.extra(select=select, where=[where], order_by=order)`
其中查询包含 u'\u0430' 或 u"а" (西里尔文),因此到目前为止它都以 utf-8 编码。
尝试从 extras 组装查询时,django/db/models/sql/compiler.py 的第 489 行出现错误: result.append('(%s)' % str(col))
所以,我尝试了所有编码/解码的东西。 LANG 变量在两台计算机上均为“ru_RU.UTF-8”,在 settings.py 中为 DEFAULT_CHARSET。没有更多的想法了。有什么帮助吗?
更新:我刚刚发现我的应用程序在两台计算机上的执行方式相同。区别在于从 shell (python manage.py runserver localhost:8000) 执行和从 eclipse 的 pydev 环境启动调试模式。那么,有人可以告诉我关于我的编码问题手动启动和 pydev 调试启动之间是否有区别吗?
TIA。 彼得
Hello all
I'm using Django 1.2.5 with Python 2.6 on two machines: Ubuntu 11.04 and Debian Lenny. First one is my local dev and second is remote server. I'm using django-fts and postgresql (database is remote and unique for both installations) to make full text search queries. The intriguing thing is I can do fts query with russian symbols in it on local machine all right. On remote server it gives me UnicodeEncodeError while evaluating my extra.
In django-fts postgre backend I find this code:
ts_query = "plainto_tsquery('%s','%s')" % (self.language, unicode(query).replace("'", "''"))
where = '%s @@ %s' % (qn(self.vector_field.column), ts_query)
select = {}
order = []
if rank_field is not None:
select[rank_field] = 'ts_rank(%s.%s, %s, %d)' % (qn(self.model._meta.db_table), qn(self.vector_field.column), ts_query, rank_normalization)
order = ['-%s' % rank_field]
return qs.extra(select=select, where=[where], order_by=order)`
where query contains u'\u0430' or u"а" (cyrillic) so it encoded in utf-8 all right so far.
Error appears in django/db/models/sql/compiler.py on line 489 while trying to assemble a query from extras:result.append('(%s)' % str(col))
So, I tried all of coding/decoding stuff. LANG variable is "ru_RU.UTF-8" on both computers and in settings.py as DEFAULT_CHARSET. Have no more ideas. Any help?
UPDATE: I've just found out that my application executes the same way on both computers. The difference is between execution from shell (python manage.py runserver localhost:8000) and debug-mode start from eclipse's pydev environment. So, can some one tell me if there's difference between manual start and pydev debug start concerning my encoding problems?
TIA.
Petr
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将 u'' 添加到示例中的所有字符串中。
就像 uts_rank(%s.%s, %s, %d)' % (...)
而且在没有数据库转义的情况下用 % 插入变量是很糟糕的。
add a u'' to all the string in your example.
like u'ts_rank(%s.%s, %s, %d)' % (...)
and also interpolating variables with % without database escape is bad.