如何在Python中使用psql的"\copy"命令?

11

我正试图将一个csv文件导入到psql数据库中。在阅读了关于COPY\copy之间差异的文章后,当我执行我的脚本时出现了以下错误。

这是我代码的一部分:

try:

   csv_data = os.path.realpath('test.csv')

   con = psycopg2.connect(database = 'db01', user = 'postgres')
   cur = con.cursor()

   cur.execute("\copy stamm_data from '%s' DELIMITER ';' csv header" % csv_data)

   con.commit()

这里是错误:

Error: syntax error at or near "\"
LINE 1: \copy stamm_data from '/home/jw/dev/test.csv' delimiter ';' ...
    ^

使用 COPY 时出现以下情况:

Error: could not open file "/home/jw/dev/test.csv" for reading: Permission denied

尽管psql用户“postgres”是超级用户,而且Ubuntu用户在运行脚本时对test.csv文件具有读取权限。

有什么想法吗?


5
\copy 是用于 psql 命令行工具的。Python 有 copy_fromcopy_to,可以实现相似的功能。 - Daniel Vérité
2
是的,要么使用copy_expert而不是copy_from - Daniel Vérité
我已经了解了copy_expert.. 使用copy_expert需要超级用户权限,这正是我想要避免的.. 顺便问一下,copy_expertpsycopg2.execute("COPY..")有什么区别吗? - jwi
1
不完全正确。只有当源是文件时,才需要使用服务器端的COPY FROM来获取超级用户权限。如果源是FROM STDIN,这意味着客户端正在将内容流式传输到服务器,而不是要求服务器打开自己文件系统中具有自己权限的文件。 - Daniel Vérité
psycopg2.execute("COPY..") 只能用于服务器文件系统上的文件,因为如果使用 psycopg2.execute("COPY tablename FROM STDIN..."),那么你如何提供输入数据呢?这就是 copy_expert 的作用。 - Daniel Vérité
显示剩余2条评论
1个回答

1
好的,我们开始吧..使用copy_from解决方案很好-我从csv文件中删除了标头,并使用copy_from导入该文件。

但是现在我遇到了以下错误:

Error: null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, foo01, ACE001, 3).

我的表格有以下列:

ID, hotelcode, hotelname, stars

ID是我的主键,因此我无法删除NOT NULL修饰符。我该如何为每一行导入ID?或者我应该如何告诉Postgres用值“DEFAULT”填充ID列,以便数据库自动生成ID?


我自己找到了解决办法:只需将我的表中ID列的类型从INT更改为SERIAL即可-运行良好。干杯! - jwi
4
如果有默认的设置,int应该能够正常工作。同时看到运行的代码也是很好的。 - Jasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接