Ошибка сохранения геоджанго PointField - PullRequest
22 голосов
/ 06 октября 2011

У меня есть гео-модель со свойством 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 , но, как и Джонатан, я не знаю, является ли этоошибка или ошибка конфигурации.

Может ли кто-нибудь указать мне правильное направление?

Вот некоторая информация о настройках:

          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 голосов
/ 07 октября 2011

Наконец-то удалось это выяснить.

Разница, как указано в этого билета , заключается в том, что Postgres 9.1 имеет standard_conforming_strings по умолчанию.На самом деле это не будет проблемой, за исключением того, что в адаптере Django есть ошибка, которая в основном игнорирует ее. Исправление было отправлено , и оно работает для меня.

Для тех, кто не желает или не может применить исправление или обновление, вы можете просто использовать этот адаптер базы данных вместо .

...