10

我的 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。(不,我没有使用存储过程,如果这是你的第一个问题......)

提前致谢

4

1 回答 1

10

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

  1. SELECT id FROM statustable WHERE value = '%s'. 如果条目存在,这将为您提供 id,在这种情况下跳过第 2 步;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id. 这将为您提供id新创建的条目。

最后——虽然我还没有验证这是否是一个问题——fetchone()提交看起来有点可疑。

于 2011-09-19T18:12:28.377 回答