如何在Python中获取Postgres中插入或选择的行ID
我的Postgres查询是:
query = """INSERT INTO statustable(value) SELECT '%s'
WHERE NOT EXISTS (SELECT id, value FROM statustable
WHERE value = '%s') RETURNING id""" % (status, status)
cursor_postgres.execute(query)
conn_postgres.commit()
statusId = cursor_postgres.fetchone()[0]
print "statusId" + str(statusId)
我需要获取新插入的状态值的ID,如果这个ID已经存在,就选择它的ID。使用RETURNING id
这个语句让我的查询完全失效,所以我不得不把它去掉,至少能让选择性插入正常工作。
有没有什么办法可以在这里获取statusId?在另一个情况下,我正在进行一个Upsert操作(如果不存在就插入,如果存在就更新)。在这里,我同样需要插入或更新后的行的ID。(不,我没有使用存储过程,如果这是你第一个想问的问题……)
提前谢谢你!
1 个回答
10
我不太明白你为什么坚持要用一个查询来解决问题。我觉得你可以用两个简单的查询来处理:
SELECT id FROM statustable WHERE value = '%s'
。这个查询会告诉你,如果这个条目存在,就会返回它的id,如果存在的话,你就可以跳过第二步;INSERT INTO statustable(value) VALUES('%s') RETURNING id
。这个查询会返回新创建条目的id
。
最后,虽然我还没确认这是否真的是个问题,但在提交后使用fetchone()
看起来有点可疑。