Python pygresql-插入并返回序列号
我正在使用访问我的数据库。在我目前正在处理的用例中;我正在尝试向表中插入一条记录并返回最后一个rowid。。。aka DB为“我的ID”字段创建的值:Python pygresql-插入并返回序列号,python,postgresql,pygresql,Python,Postgresql,Pygresql,我正在使用访问我的数据库。在我目前正在处理的用例中;我正在尝试向表中插入一条记录并返回最后一个rowid。。。aka DB为“我的ID”字段创建的值: create table job_runners ( id SERIAL PRIMARY KEY, hostname varchar(100) not null, is_available boolean default FALSE ); sql = "insert into job_
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字段值的最佳方法是什么,而不需要进行任何额外的读取或查询
INSERT INTO job_runners
(hostname,is_available) VALUES ('localhost',true)
RETURNING id
也就是说,我不知道pygresql,但是根据您已经编写的内容,我猜您想在这里使用的是
db.query()
。pygresql中的文档说,如果您使用insert/update语句调用dbconn.query(),它将返回OID。它接着讲述了当涉及多行时OID的列表
首先,;我发现OID功能不起作用。我想知道libs和工具的版本号会有所帮助,但是,我并没有试图返回OID
最后,;通过添加@hacker建议的“returning id”,pygresql做了正确的事情,并在结果字典中返回了一个带有id的记录集(见下面的代码)
假设您有一个游标对象
cur
:
cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id",
{'hostname': 'localhost'})
id = cur.fetchone()[0]
这可确保PyGreSQL正确转义输入字符串,从而防止SQL注入。请提供更多信息:对db.insert()/db.query()的实际调用、确切的错误消息、Postgres和PyGreSQL的版本,等等@hacker-虽然上面的SQL帮助了我,但我的问题是pygresql和从DB获取ID。从DB获取ID是在
返回部分。我假设您知道如何得到db.query()
产生的结果。如果没有这一点,它将无法将生成的id返回给客户端。只需阅读您自己的问题答案;-)OID并不是一个很好的方法,因为您并不总是有OID,我不认为INSERT
会返回多个OID(但我不确定,因为我从未使用过它),最后您仍然需要从OID推断id
。通过SELECT
ingcurrval('job\u runners\u id\u seq')
@hacker,这将更容易实现-PERL的DBI类提供了一个方法/属性“last\u insert\u id”。这与“返回”不同。阅读文档说明返回类似于“选择”。谢谢你为我指明了回答这个问题的方向。
cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id",
{'hostname': 'localhost'})
id = cur.fetchone()[0]