【问题标题】:Does the Psycopg2 "copy_from" Function (or the PostgreSQL COPY command) Support Sequence "nextval()" Function ValuesPsycopg2“copy_from”函数(或 PostgreSQL COPY 命令)是否支持序列“nextval()”函数值
【发布时间】:2019-11-17 02:54:01
【问题描述】:

我有一个数据库,我一次插入大量行(约 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 库的更多信息。

【问题讨论】:

    标签: python postgresql relational-database


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 2012-07-16
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多