psycopg2.ProgrammingError,运行脚本从Postgres序列化Django应用数据

0 投票
1 回答
700 浏览
提问于 2025-04-17 00:18

我有一个 django web 应用,它用来存储一些数据到 postgres 数据库。为了把数据库里的数据复制到 json 文件,我通常会使用 python manage.py shell,然后按照 Django 教程中的说明使用序列化 API。

>>>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 shell 中尝试运行

>>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 中运行脚本时会出现这个错误?我已经把我的应用模块放在 PYTHONPATH 里了。

1 个回答

1

你有没有试过用 ./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")

撰写回答