1

我正在使用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 字段的值而不进行任何额外读取或查询的最佳方法是什么?

4

3 回答 3

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

也就是说,我对pygresql一无所知,但是根据您已经编写的内容,我想db.query()您想在这里使用它。

于 2009-09-17T12:09:20.167 回答
1

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

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

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

sql = "insert into job_runners (hostname) values ('localhost') returning id"
rv = dbconn.query(sql)
id = rv.dictresult()[0]['id']
于 2009-09-17T16:52:05.770 回答
0

假设您有一个光标对象cur

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

这可确保 PyGreSQL 正确转义输入字符串,防止 SQL 注入。

于 2010-02-27T00:40:03.923 回答