psycopg2-字段“ id”的数据丢失错误吗?

时间:2018-10-14 20:39:24

标签: python python-3.x postgresql csv psycopg2

我正在将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和company数据的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字段?

1 个答案:

答案 0 :(得分:1)

您有两个选择。您可以在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并不是序列的最佳名称,在需要时如何命名下一个?)