pygresql - 插入并返回序列
我正在使用 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']