在Python/Django(Heroku上)中从STDIN复制到POSTGRESQL
我正在Heroku上设置一个Django应用,需要把数据库从sqlite3换成postgresql。不过,我现在用的是共享数据库,所以不能直接用psql访问数据库命令行,也不能用文件执行COPY
命令。
比如说,这个方法就不行:
from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("copy table_name from 'table_dump.dmp' delimiters ',' csv;")
我收到这个错误:
DatabaseError: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
所以我尝试把文件内容作为字符串读入COPY
命令,像这样:
cursor.execute("copy tabe_name from '%s' delimiters ',' csv header;" % f.read())
(大部分情况下,这些文件都很小,最大也就131kb。)
结果我还是遇到了同样的错误(而且还因为没有正确处理我的'而受到很多折磨——我到底需要多少个反斜杠呢?)
那么,在Django命令行中,最简单的COPY
到postgresql的方法是什么呢?我以为直接用字符串代替文件引用就可以了。
3 个回答
0
Taps这个工具在使用sqlite时效果不好。其实,你可以使用Heroku实验室里新推出的共享Postgres,这样可以更方便地进行数据导入。想了解更多信息,可以查看这个链接:http://devcenter.heroku.com/articles/labs-heroku-shared-postgresql
这样你就可以按照预期来复制数据了。
0
你需要像这样给服务器发送一个命令:
COPY table_name FROM STDIN DELIMITERS ',' CSV HEADER
然后使用特定驱动的调用来“上传复制数据”到服务器。如果你在使用 psycopg2,并且能从 Django 中获取到底层的连接句柄,关于如何使用它来执行 COPY 语句的文档在这里:http://packages.python.org/psycopg2/cursor.html#cursor.copy_expert
3