2011-10-05 24 views
22

Tengo un modelo geográfico con una propiedad PointField. Todo funciona perfectamente a nivel local, pero cuando intento para salvar a una instancia en el servidor, me sale el siguiente error:Error al guardar geodjango PointField

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

cavé en la fuente y se encontró que los valores se publica por entregas de manera diferente; específicamente, ese valor no se está escapando antes de que la consulta se ejecute en el servidor. Parece que el escapado se está realizando por psycopg2.Binary.getquoted() y, por supuesto, no devuelve el valor correcto en el servidor.

En mi máquina:

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

En el servidor:

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

bien, eso explica por qué cree que estoy tratando de insertar un byte nulo. (Porque lo soy.) Así que ahora sé lo suficiente sobre lo que está pasando para encontrar un informe similar de Jonathan S. en el django-users group pero, al igual que Jonathan, no sé si se trata de un error o un error de configuración.

¿Puede alguien señalarme en la dirección correcta?

aquí hay algo de información sobre las configuraciones:

  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 

Respuesta

42

finalmente logró averiguarlo.

La diferencia, como se documenta en this ticket, es que Postgres 9.1 tiene standard_conforming_strings activado de forma predeterminada. Lo cual no sería un problema, en realidad, excepto que el adaptador de Django tiene un error que básicamente lo ignora. A patch was submitted y está funcionando para mí.

Para aquellos que no quieran o no puedan aplicar el parche o la actualización, solo pueden usar this database adapter instead.

+1

Gracias por compartir matthew. Estoy muy contento de haber tropezado con tu publicación :) – infiniteloop

+0

¡Me alegro de que haya sido útil! – matthewwithanm

+0

Gracias! establecer standard_conforming_strings = off en postgresql.conf también funcionó para mí. – Pablo

Cuestiones relacionadas