Psycopg2 "copy_from" 函数(或 PostgreSQL COPY 命令)是否支持序列 "nextval()" 函数值
Does the Psycopg2 "copy_from" Function (or the PostgreSQL COPY command) Support Sequence "nextval()" Function Values
我有一个数据库,一次要插入大量行 (~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')
时,程序结束运行并将行插入 table。我想知道是否需要做一些特别的事情才能使 "nextval()" 函数正常工作。另外,如果有人可以解释为什么 "nextval()" 函数不起作用,而 "now()" 函数起作用,那也很好。我还可以获取当前序列值并将值插入 CSV 并递增该值,然后使用 "setval()" 函数更新序列,但我想我会尝试了解有关 Psycopg2 库的更多信息。
回答我自己的问题....
PostgreSQL的COPY命令和Psycopg2的"copy_from"函数好像都不支持nextval('seq_key')
,但是支持now()
等不需要连续读取的函数数据库。同样重要的是要注意,如果使用 now()
,即使将所有行复制到数据库中需要几秒钟的时间,所有条目对于该列都将具有相同的值(这是有道理的,因为您正在尝试同时插入它们)。
我可以通过不指定序列号的值并允许它使用默认值 nextval('seq_key')
来解决这个问题。我是 PostgreSQL 的新手,所以可能有一些有用的数据库函数在使用 COPY 命令时也不允许使用。对于 nextval('seq_key')
,这不是什么大问题,因为无论如何您通常都想使用它,但是可能有更多的 PostgreSQL 函数不能与 COPY 一起使用,它们可能不像 [=10= 那样直接].
无论如何,希望这对那里的人有所帮助!有点明显 question/solution,但如果有人有任何问题,请告诉我!
我有一个数据库,一次要插入大量行 (~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')
时,程序结束运行并将行插入 table。我想知道是否需要做一些特别的事情才能使 "nextval()" 函数正常工作。另外,如果有人可以解释为什么 "nextval()" 函数不起作用,而 "now()" 函数起作用,那也很好。我还可以获取当前序列值并将值插入 CSV 并递增该值,然后使用 "setval()" 函数更新序列,但我想我会尝试了解有关 Psycopg2 库的更多信息。
回答我自己的问题....
PostgreSQL的COPY命令和Psycopg2的"copy_from"函数好像都不支持nextval('seq_key')
,但是支持now()
等不需要连续读取的函数数据库。同样重要的是要注意,如果使用 now()
,即使将所有行复制到数据库中需要几秒钟的时间,所有条目对于该列都将具有相同的值(这是有道理的,因为您正在尝试同时插入它们)。
我可以通过不指定序列号的值并允许它使用默认值 nextval('seq_key')
来解决这个问题。我是 PostgreSQL 的新手,所以可能有一些有用的数据库函数在使用 COPY 命令时也不允许使用。对于 nextval('seq_key')
,这不是什么大问题,因为无论如何您通常都想使用它,但是可能有更多的 PostgreSQL 函数不能与 COPY 一起使用,它们可能不像 [=10= 那样直接].
无论如何,希望这对那里的人有所帮助!有点明显 question/solution,但如果有人有任何问题,请告诉我!