我正在使用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字段值的最佳方法,而不进行任何额外的读取或查询?
答案 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注入。