2011-10-05 14 views
22

Ho un modello geografico con una proprietà PointField. Tutto funziona alla perfezione a livello locale, ma quando provo a salvare un'istanza sul server, ottengo il seguente errore:Errore nel salvataggio di geodjango PointField

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

ho scavato nella sorgente e ha scoperto che i valori vengono serializzati in modo diverso; in particolare, quel valore non viene scappato prima che la query venga eseguita sul server. Sembra che l'escaping sia fatto da psycopg2.Binary.getquoted() e sicuramente, non restituisce il valore corretto sul server.

Sulla mia macchina:

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

Sul server:

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

Okay, questo spiega perché pensa che io sto cercando di inserire un byte null. (Perché io sono.) Così ora so abbastanza su cosa non va nel trovare un rapporto simile di Jonathan S. su django-users group ma, come Jonathan, non so se si tratta di un bug o di un errore di configurazione.

Qualcuno può indicarmi la giusta direzione?

Ecco alcune informazioni circa le impostazioni:

  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 

risposta

42

finalmente sono riuscita a capirlo.

La differenza, come documentato in this ticket, è che Postgres 9.1 ha standard_conforming_strings attivato per impostazione predefinita. Il che non sarebbe un problema, in realtà, tranne che l'adattatore di Django ha un bug che fondamentalmente lo ignora. A patch was submitted e funziona per me.

Per coloro che non desiderano o non sono in grado di applicare la patch o l'aggiornamento, è sufficiente utilizzare this database adapter instead.

+1

Grazie per aver condiviso Matthew. Sono davvero felice di essermi imbattuto nel tuo post :) – infiniteloop

+0

Felice che sia stato d'aiuto! – matthewwithanm

+0

Grazie! anche l'impostazione standard_conforming_strings = off in postgresql.conf ha funzionato per me. – Pablo

Problemi correlati