2011-10-05 99 views
22

我有一个具有PointField属性的地理模型。一切都完美的作品在当地,但是当我尝试保存在服务器上的一个实例,我得到以下错误:保存geodjango 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" 

好吧,这可以解释为什么它认为我试图插入一个空字节。 (因为我是。)所以,现在我已经足够了解Jonathan S.在django-users group上找到类似的报告有什么问题,但是像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 

回答

42

终于弄明白。

this ticket所述,差异在于默认情况下Postgres 9.1具有standard_conforming_strings。这真的不是问题,除非Django的适配器有一个基本上忽略它的错误。 A patch was submitted它在为我工作。

对于那些不愿意或无法应用补丁或升级的用户,只需使用this database adapter instead即可。

+1

感谢分享matthew。我真的很高兴,我偶然发现你的帖子:) – infiniteloop

+0

很高兴它帮助! – matthewwithanm

+0

谢谢!在postgresql.conf中设置standard_conforming_strings = off也适用于我。 – Pablo