pygresql - 插入并返回序列

1 投票
3 回答
2637 浏览
提问于 2025-04-15 14:23

我正在使用 PyGreSQL 来访问我的数据库。在我现在正在处理的这个案例中,我想往一个表里插入一条记录,并且想要返回最后生成的行ID,也就是数据库为我的ID字段创建的值:

create table job_runners (
    id           SERIAL PRIMARY KEY,
    hostname     varchar(100) not null,
    is_available boolean default FALSE
    );

sql = "insert into job_runners (hostname) values ('localhost')"

当我使用 db.insert() 方法时,这个方法听起来最合适,但我却收到了一个“AttributeError”的错误。而当我尝试使用 db.query(sql) 时,只得到一个OID。

问题:使用 PyGreSQL,插入记录并返回ID字段的值,最好的方法是什么,而不需要额外的读取或查询?

3 个回答

0

假设你有一个游标对象 cur

cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id",
            {'hostname': 'localhost'})
id = cur.fetchone()[0]

这样做可以确保PyGreSQL正确处理输入的字符串,防止SQL注入攻击。

2
INSERT INTO job_runners
    (hostname,is_available) VALUES ('localhost',true)
    RETURNING id

话说回来,我对pygresql不太了解,不过根据你已经写的内容,我猜你想用的是db.query()这个方法。

1

PyGreSQL的文档说,如果你用dbconn.query()去执行插入或更新的语句,它会返回一个OID。文档还提到,当涉及到多行数据时,会有OID的列表。

首先,我发现OID的功能并没有正常工作。我想知道库和工具的版本号可能会有帮助,不过我当时并不是想要返回OID。

最后,按照@hacker的建议,在语句后面加上“returning id”,pygresql就正常工作了,返回了一个包含ID的记录集,结果以字典的形式呈现(见下面的代码)。

sql = "insert into job_runners (hostname) values ('localhost') returning id"
rv = dbconn.query(sql)
id = rv.dictresult()[0]['id']

撰写回答