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

Posted

技术标签:

【中文标题】psycopg2 - 字段“id”缺少数据时出错?【英文标题】:psycopg2 - Error missing data for field "id"? 【发布时间】:2018-10-14 20:39:24 【问题描述】:

我正在将 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 字段?

【问题讨论】:

【参考方案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 不是一个序列的最佳名称,需要时如何命名下一个?)

【讨论】:

感谢@klin,是否可以根据 CSV 文件中的标题动态填充列列表? 在Postgres中不会自动,但在Python中应该很容易,只需读取文件的第一行并分别格式化命令即可。 好的,这就是我在此期间所做的,这很好。但是,我现在确实收到一个错误,说尽管突出显示的列名确实存在,但该列不存在事件。我认为区分大小写不会成为问题? 这肯定是个问题,请阅读文档中的this answer 或Identifiers and Key Words。

以上是关于psycopg2 - 字段“id”缺少数据时出错?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Psycopg2 将 Spark DataFrame 写入 Redshift 时出错:无法腌制 psycopg2.extensions.cursor 对象

Dokku 编译错误 - django.core.exceptions.ImproperlyConfigured: 加载psycopg2模块时出错,没有名为'psycopg2'的模块。

在 Windows 上安装 psycopg2 时出错

CAKEPHP 3.x - 实体更新时出错 - 即使有值,也会声明缺少字段

Django,mod_wsgi,psycopg2 配置不当:加载 psycopg2 模块时出错:没有名为 _psycopg 的模块

在 Mac OS 10.6 上安装 psycopg2 时出错