Python psycopg2-字段“缺少数据”时出错;id";?

Python psycopg2-字段“缺少数据”时出错;id";?,python,python-3.x,postgresql,csv,psycopg2,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

我正在将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')
);
我运行此代码以导入CSV,其中包含fname、lname和company的数据:

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表的模式,以便在尝试插入之前验证副本。常规插入将成功,因为id字段将填充来自SEQ的值

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

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

从STDIN CSV头引号中复制我的\u tbl(fname、lname、company)
或者,创建不带
id
主键的表,导入csv数据,然后添加主键:

ALTER TABLE my\u tbl ADD id串行主键;

不相关。您不必为序列列创建序列,让Postgres为您执行以下操作:

CREATE TABLE my\u tbl(
fname varchar(100),
lname varchar(100),
varchar公司(200),
id串行主键
);

然后系统知道表和序列之间的关系。(另外,
serial
不是序列的最佳名称,需要时如何命名下一个序列?)

谢谢@klin,可以根据CSV文件中的标题动态填充列列表吗?在Postgres中不会自动填充,但在Python中应该很容易,只需读取文件的第一行并分别格式化命令。好的,这是我在此期间所做的,所以很好。但是我现在确实收到了一个错误虽然突出显示的列名确实存在,但该列不存在事件。我假设区分大小写不会成为问题?当然可能是问题,请阅读或在文档中。