如何使用python在postgres中获取插入或选择的行ID

时间:2011-09-19 16:26:54

标签: python postgresql upsert

我的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。 RETURNING id完全扼杀了这个查询,所以我不得不删除它至少让选择性插入工作。

有关如何获取statusId的任何线索?在另一个例子中,我正在做一个Upsert。(如果不存在则插入,否则更新)这里再次,我需要插入或更新的行id。 (不,我没有使用存储过程,如果那是你的第一个问题......)

提前致谢

1 个答案:

答案 0 :(得分:10)

我不能说我完全理解你坚持单一查询的动机。我认为你最好的选择是提出两个简单的问题:

  1. SELECT id FROM statustable WHERE value = '%s'。如果条目存在,这将为您提供id,在这种情况下跳过步骤2;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id。这将为您提供新创建的条目的id
  3. 最后 - 虽然我还没有验证这是否是一个问题 - 提交中的fetchone()看起来有点怀疑。