django: невозможно исправить ошибку при импорте данных из базы данных postgres - PullRequest
4 голосов
/ 16 июня 2010

У меня странная ошибка при установке прибора из сброшенных данных. Я использую psycopg2, и django1.1.1

silver:probsbox oleg$ python manage.py loaddata /Users/oleg/probs.json 
Installing json fixture '/Users/oleg/probs' from '/Users/oleg/probs'.
Problem installing fixture '/Users/oleg/probs.json': Traceback (most recent call last):
  File "/opt/local/lib/python2.5/site-packages/django/core/management/commands/loaddata.py", line 153, in handle
    obj.save()
  File "/opt/local/lib/python2.5/site-packages/django/core/serializers/base.py", line 163, in save
    models.Model.save_base(self.object, raw=True)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/base.py", line 495, in save_base
    result = manager._insert(values, return_id=update_pk)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/manager.py", line 177, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/query.py", line 1087, in insert_query
    return query.execute_sql(return_id)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/sql/subqueries.py", line 320, in execute_sql
    cursor = super(InsertQuery, self).execute_sql(None)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/opt/local/lib/python2.5/site-packages/django/db/backends/util.py", line 19, in execute
    return self.cursor.execute(sql, params)
ProgrammingError: can't adapt

Сначала я проверил подобные проблемы в интернете. Это, похоже, очень связано: http://code.djangoproject.com/ticket/5996,, поскольку в моих данных много символов не ASCII

Но на самом деле я проверил мою установку django, и там все нормально

Не могли бы вы посоветовать, что не так

====

Продолжено расследование после добавления печатного заявления в соответствии с первым ответом. Лог выглядит так:

silver:probsbox oleg$ python manage.py loaddata /Users/oleg/probs.json 
Installing json fixture '/Users/oleg/probs' from '/Users/oleg/probs'.
<DeserializedObject: Novice>
<DeserializedObject: Junior>
<DeserializedObject: Chess enthusiast>
<DeserializedObject: Experienced player >
<DeserializedObject: Smart player>
Problem installing fixture '/Users/oleg/probs.json': Traceback (most recent call last):
  File "/opt/local/lib/python2.5/site-packages/django/core/management/commands/loaddata.py", line 153, in handle
    print obj
  File "/opt/local/lib/python2.5/site-packages/django/core/serializers/base.py", line 155, in __repr__
    return "<DeserializedObject: %s>" % smart_str(self.object)
  File "/opt/local/lib/python2.5/site-packages/django/utils/encoding.py", line 107, in smart_str
    return str(s)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/base.py", line 335, in __str__
    return force_unicode(self).encode('utf-8')
  File "/opt/local/lib/python2.5/site-packages/django/utils/encoding.py", line 71, in force_unicode
    s = unicode(s)
  File "/Users/oleg/Sites/probsbox/registration/models.py", line 58, in __unicode__
    return u"%s's profile" %(self.user.username)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/fields/related.py", line 257, in __get__
    rel_obj = QuerySet(self.field.rel.to).get(**params)
  File "/opt/local/lib/python2.5/site-packages/django/db/models/query.py", line 305, in get
    % self.model._meta.object_name)
DoesNotExist: User matching query does not exist.

silver:probsbox oleg$ 

Ошибка из самого последнего комментария

<DeserializedObject: qwert2000's profile>

Проблема с установкой приспособления '/Users/oleg/probs.json': трассировка (последний вызов был последним): Файл "/opt/local/lib/python2.5/site-packages/django/core/management/commands/loaddata.py", строка 154, в дескрипторе obj.save () Файл "/opt/local/lib/python2.5/site-packages/django/core/serializers/base.py", строка 163, в сохранении models.Model.save_base (self.object, raw = True) Файл "/opt/local/lib/python2.5/site-packages/django/db/models/base.py", строка 495, в save_base результат = manager._insert (значения, return_id = update_pk) Файл "/opt/local/lib/python2.5/site-packages/django/db/models/manager.py", строка 177, в _insert вернуть insert_query (self.model, values, ** kwargs) Файл "/opt/local/lib/python2.5/site-packages/django/db/models/query.py", строка 1087, в insert_query return query.execute_sql (return_id) Файл "/opt/local/lib/python2.5/site-packages/django/db/models/sql/subqueries.py", строка 320, в execute_sql курсор = супер (InsertQuery, самостоятельно) .execute_sql (нет) Файл "/opt/local/lib/python2.5/site-packages/django/db/models/sql/query.py", строка 2369, в execute_sql cursor.execute (sql, params) Файл "/opt/local/lib/python2.5/site-packages/django/db/backends/util.py", строка 19, в исполнении вернуть self.cursor.execute (sql, params) Ошибка программирования: невозможно адаптировать

Ответы [ 2 ]

5 голосов
/ 16 июня 2010

Ошибка can't adapt возникает в psycopg2, когда он получает тип данных, который он не знает, как преобразовать в значение для оператора SQL.Например, если вы случайно передадите список, скажем, для значения, которое должно быть целым числом, psycopg2 будет выдавать ошибку, которая не может быть адаптирована.

Документ faq.txt, поставляемый с исходным дистрибутивомиз psycopg2 объясняет это так:

Почему !cursor.execute() вызывает исключение Не может адаптироваться ?

Psycopg преобразует объекты Python в строковое представление SQLглядя на объект класса.Исключение возникает, когда вы пытаетесь передать в качестве параметра запроса объект, для которого для его класса не зарегистрирован адаптер.См .: ref: adapting-new-types для получения информации.

Вероятно, ваш лучший первый шаг при нахождении значения оскорбления - это запуск loaddata в полностью подробном режиме: python manage.py loaddata --verbosity= 2 /Users/oleg/probs.json

Ну, я надеялся, что многословность loaddata сработает, и мне не пришлось бы признаваться, что я никогда не находил элегантный способ отладки ошибок адаптации с помощьюloaddata Джанго.В прошлом я прибегал к вставке операторов печати в функцию loaddata в django, чтобы я мог видеть десериализацию значений при возникновении ошибки.Я редактировал django/core/management/loaddata.py.Посмотрите на obj.save() в функции handle().Я надеюсь, что это признание вдохновляет кого-то поделиться лучшим решением: -)

0 голосов
/ 18 июня 2010

Хорошо, я закончил копировать дамп из моей базы данных и восстанавливать его локально без python ...

...