psycopg2.ProgrammingError, запускающий скрипт для сериализации данных приложения django из postgres - PullRequest
0 голосов
/ 25 августа 2011

У меня есть djano web app, в котором данные о некоторых записях хранятся в postgres db. Чтобы скопировать данные в дБ в json file с, я обычно использую python manage.py shell и использую API сериализации, как упомянуто в руководстве django. .

>>>python manage.py shell
...
In[8]:from myapp.models import MyFirstModel
In[9]:data = serializers.serialize("xml", MyFirstModel.objects.all())
In[10]:print data

Я копирую этот вывод в какой-то текстовый файл и сохраняю его как json.

Я подумал написать скрипт для этого и попытался

datacopy.py ........

...
filename = os.path.join(dirpath,basefilename+".json")

def write_data_to_file():
    from django.core import serializers
    XMLSerializer = serializers.get_serializer("json")
    xml_serializer = XMLSerializer()
    out = open(filename,"a")
    from django.contrib.auth.models import User
    from myapp.models import MyFirstModel
    from myapp.models import MyNextModel
    xml_serializer.serialize(User.objects.all(), stream=out)
    xml_serializer.serialize(MyFirstModel.objects.all(), stream=out)
    xml_serializer.serialize(MyNextModel.objects.all(), stream=out)

if __name__ == '__main__':
    write_data_to_file()

из оболочки bash я пробовал

>>python datacopy.py

Но это записывает только данные модели пользователя и не копирует модели, которые я создаю в своем приложении.

Сообщение об ошибке я получаю

Traceback (most recent call last):
  File "datacopy.py", line 29, in <module>
    write_data_to_file()
  File "datacopy.py", line 23, in write_data_to_file
    xml_serializer.serialize(MyFirstModel.objects.all(), stream=out)
  File "/home/me/Django-1.1.1/django/core/serializers/base.py", line 38, in serialize
    for obj in queryset:
  File "/home/me/Django-1.1.1/django/db/models/query.py", line 106, in _result_iter
    self._fill_cache()
  File "/home/me/Django-1.1.1/django/db/models/query.py", line 692, in _fill_cache
    self._result_cache.append(self._iter.next())
  File "/home/me/Django-1.1.1/django/db/models/query.py", line 238, in iterator
    for row in self.query.results_iter():
  File "/home/me/Django-1.1.1/django/db/models/sql/query.py", line 287, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/home/me/Django-1.1.1/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/home/me/Django-1.1.1/django/db/backends/util.py", line 19, in execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "myapp_myfirstmodel" does not exist

Я могу копировать данные всех трех моделей при использовании python manage.py shell. Почему эта ошибка возникает при запуске скрипта из bash? У меня есть модули myapp в PYTHONPATH

1 Ответ

1 голос
/ 25 августа 2011

Вы рассматривали возможность использования ./manage.py dumpdata?Вы можете указать формат сериализации.

Для того, чтобы ваш скрипт работал, вы должны установить DJANGO_SETTINGS на правильные settings.py?

Во-вторых, есть ли причина, по которой вы выполняете импорт внутри функции,наверное лучше переместить их в начало файла:

from django.core import serializers
from django.contrib.auth.models import User
from myapp.models import MyFirstModel
from myapp.models import MyNextModel

def write_data_to_file():
    XMLSerializer = serializers.get_serializer("json")
    xml_serializer = XMLSerializer()
    out = open(filename,"a")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...