psycopg2.ProgrammingError,运行脚本从Postgres序列化Django应用数据
我有一个 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")