gpt4 book ai didi

python - psycopg2 - 字段 "id"缺少数据时出错?

转载 作者:行者123 更新时间:2023-11-29 13:12:47 27 4
gpt4 key购买 nike

我正在将 CSV 文件导入 postgres,但数据集中没有唯一列。我想添加一个序列 ID 字段,以便在插入到表中时唯一标识每条记录。

在触发导入之前,我已经创建了一个序列并在表结构中添加了一个 ID 字段:

CREATE SEQUENCE IF NOT EXISTS serial;
CREATE TABLE my_tbl (
fname varchar(100),
lname varchar(100),
company varchar(200),
id integer PRIMARY KEY DEFAULT nextval('serial')
);

我运行此代码以导入包含 fname、lname 和公司数据的 CSV:

conn = psycopg2.connect(dbname=dbname, host=host, port=port, user=user, password=pwd)
cur = conn.cursor()
cur.copy_expert("copy {} from STDIN CSV HEADER QUOTE '\"'".format(table_name), file)
cur.execute("commit;")

但是,我收到一条错误消息,提示我缺少字段“id”的数据。我假设在引擎盖下 psycopg2 正在匹配 CSV 和 PG 表的模式以在尝试插入之前验证 COPY。常规插入会成功,因为 id 字段将填充 SEQ 中的值。

如何为从 CSV 复制到 PG 表的每条记录添加唯一 ID 字段?

最佳答案

你有两个选择。您可以在 COPY 命令中指定目标表的列,例如:

COPY my_tbl(fname, lname, company) FROM STDIN CSV HEADER QUOTE '"'

或者,创建没有 id 主键的表,导入 csv 数据,然后才添加主键:

ALTER TABLE my_tbl ADD id serial PRIMARY KEY;

不相关。您不必为序列列创建序列,让 Postgres 为您做这件事:

CREATE TABLE my_tbl (
fname varchar(100),
lname varchar(100),
company varchar(200),
id serial PRIMARY KEY
);

那么系统就知道表和序列的关系了。 (此外,serial 不是序列的最佳名称,当您需要时如何命名下一个序列?)

关于python - psycopg2 - 字段 "id"缺少数据时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52806900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com