pygresql - 插入并返回序列

时间:2009-09-17 12:05:16

标签: python postgresql pygresql

我正在使用PyGreSQL来访问我的数据库。在我正在使用的用例中;我正在尝试将记录插入表中并返回最后一个rowid ...也就是数据库为我的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 :(得分:1)

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

那就是说,我不知道pygresql,但是根据你已经写过的内容,我想你想在这里使用db.query()

答案 1 :(得分:0)

PyGreSQL中的文档说如果使用和insert / update语句调用dbconn.query(),它将返回OID。当涉及多行时,它会继续说明OID列表。

首先;我发现OID功能不起作用。我想知道lib和工具的版本号会有所帮助,但是,我并没有试图返回OID。

最后;通过追加“返回id”,正如@hacker所建议的那样,pygresql只是做了正确的事情,并在结果字典中返回了一个带有ID的记录集(参见下面的代码)。

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

答案 2 :(得分:0)

假设您有一个游标对象cur

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

这可以确保PyGreSQL正确地转义输入字符串,从而阻止SQL注入。