如何在Python中获取Postgres中插入或选择的行ID

10 投票
1 回答
8352 浏览
提问于 2025-04-17 02:37

我的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

我不太明白你为什么坚持要用一个查询来解决问题。我觉得你可以用两个简单的查询来处理:

  1. SELECT id FROM statustable WHERE value = '%s'。这个查询会告诉你,如果这个条目存在,就会返回它的id,如果存在的话,你就可以跳过第二步;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id。这个查询会返回新创建条目的id

最后,虽然我还没确认这是否真的是个问题,但在提交后使用fetchone()看起来有点可疑。

撰写回答