在Python/Django(Heroku上)中从STDIN复制到POSTGRESQL

2 投票
3 回答
2829 浏览
提问于 2025-04-17 10:38

我正在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

可以直接使用

heroku db:push

http://devcenter.heroku.com/articles/taps

撰写回答