首页 > 解决方案 > Psycopg2“copy_from”函数(或 PostgreSQL COPY 命令)是否支持序列“nextval()”函数值

问题描述

我有一个数据库,我一次插入大量行(~100,000)。从 PostgreSQL 文档来看,“COPY”命令的用例似乎主要用于移动数据库、将数据库备份到 CSV 等。我的用例似乎与列出的用例不在同一领域以前,但我相信它会提高插入性能。

现在,我正在尝试使用一个小的 CSV 文件测试 Psycopg2 Python 库的函数“copy_from”命令。主键是一个序列整数,我之前一直使用 nextval('seq_key') 函数来查找它的值。现在我已经切换到“copy_from”命令,我创建了一个包含值的 CSV 文件:

nextval('seq_key'),4,1573946481,'Test1', now(),now()
nextval('seq_key'),4,1573946481,'Test2', now(),now()
nextval('seq_key'),4,1573946481,'Test3', now(),now()

我正在使用以下代码调用“copy_from”命令:

    cur = conn.cursor()
    cur.copy_from(test_file, "test_master", sep=",", null="NULL")
    conn.commit()

我收到错误消息:

"invalid input syntax for integer: "nextval('seq_key')"

当我删除 时nextval('seq_key'),程序最终工作并将行插入表中。我想知道是否需要做一些特别的事情才能使“nextval()”函数正常工作。此外,如果有人能解释为什么“nextval()”函数不起作用,但“now()”函数也能做到,那也很好。我还可以获取当前序列值并将该值插入并递增到 CSV,然后使用“setval()”函数更新序列,但我想我会尝试了解有关 Psycopg2 库的更多信息。

标签: pythonpostgresqlrelational-database

解决方案


回答我自己的问题......

似乎 PostgreSQL 的 COPY 命令和 Psycopg2 的“copy_from”函数都不支持nextval('seq_key'),但它们确实支持now()和其他不需要从数据库进行连续读取的函数。同样重要的是要注意,如果now()使用,即使将所有行复制到数据库需要几秒钟的时间,所有条目都将具有该列的相同值(这是有道理的,因为您试图将它们全部插入同时)。

我能够通过不指定序列号的值并允许它使用默认值来解决这个问题nextval('seq_key')。我对 PostgreSQL 相当陌生,因此在使用 COPY 命令时,可能会有一些有用的数据库函数也不允许使用。对于nextval('seq_key'),这没什么大不了的,因为无论如何您通常都想使用它,但是可能有更多的 PostgreSQL 函数不能与 COPY 一起使用,这些函数可能不像nextval('seq_key').

无论如何,希望这可以帮助那里的人!有点明显的问题/解决方案,但如果有人有任何问题,请告诉我!


推荐阅读