保存geodjango PointField时出现错误

22

我有一个包含PointField属性的地理模型。本地一切都运行完美,但是当我尝试在服务器上保存一个实例时,我会得到以下错误:

django.db.utils.DatabaseError: invalid byte sequence for encoding "UTF8": 0x00

我深入研究了源代码,并发现这些值被序列化的方式不同;具体来说,在查询在服务器上执行之前,该值没有被转义。看起来这个转义是由psycopg2.Binary.getquoted()完成的,确实,在服务器上它并没有返回正确的值。

在我的机器上:

from psycopg2 import Binary
Binary('\0').getquoted() # > "'\\\\000'::bytea"

在服务器上:

from psycopg2 import Binary
Binary('\0').getquoted() # > "'\\000'::bytea"

好的,这解释了为什么它认为我正在尝试插入空字节。(因为我确实在尝试)。现在我知道了足够出错的原因,可以在django-users group找到Jonathan S.发表的类似报告,但像Jonathan一样,我不知道这是一个错误还是配置错误。

有人能指点我正确的方向吗?

以下是一些关于设置的信息:

          My computer      Server
OS        OSX 10.7         CentOS 5.5
Python    2.7              2.6
Django    1.3              1.3
Postgres  9.0.4            9.9.1
postgis   1.5.2            1.5.3-2.rhel5
geos      3.3.0            3.3.0-1.rhel5
1个回答

42

终于弄明白了。

正如在这个问题中所记录的那样,不同之处在于Postgres 9.1默认启用了standard_conforming_strings。这本来不是问题,但是Django的适配器有一个bug,基本上忽略了它。已经提交补丁并且对我有效。

对于那些不愿意或无法应用补丁或升级的人,可以使用这个数据库适配器代替。


1
感谢分享,Matthew。我真的很高兴偶然发现了你的文章 :) - infiniteloop
谢谢!在postgresql.conf中设置standard_conforming_strings = off 对我也起作用。 - Pablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接