Python pygresql-插入并返回序列号

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_

我正在使用访问我的数据库。在我目前正在处理的用例中;我正在尝试向表中插入一条记录并返回最后一个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_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
ing
currval('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]