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

如何使用python在postgres中获取插入或选定的行id,python,postgresql,upsert,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) c

我的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完全阻塞了这个查询,所以我必须删除它,以至少使选择性插入工作

有什么线索可以在这里找到statusId吗?在另一个例子中,我正在执行Upsert。如果不存在,请插入,否则在此处再次更新,我需要插入或更新的行id。不,我没有使用存储过程,如果这是您的第一个问题


提前谢谢

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

从statustable中选择id,其中值='%s'。如果条目存在,这将为您提供id,在这种情况下,请跳过步骤2; 将返回id的值“%s”插入statustablevalue。这将为您提供新创建项的id。
最后,虽然我还没有验证这是否是一个问题,但在提交过程中获取一个看起来有点可疑。

我觉得最快的方法可能是在一个事务中执行三个查询(如果需要的话)。1从statustable中选择id,其中值=“%s”%status 2如果没有返回行,请插入statustable值“%s”%status。3选择curvalpk_seq无论调用什么pk_seq作为主键id的序列。但由于这不是您所要求的,因此不在答案中。感谢@ed的回复。事实2和3可以通过插入到statustable值进行合并,“%s”正在返回id%状态,因为这也将返回id。但我希望将这一切都放在一起。感谢@aix的重播,我做到了这一点,我将查询分为2个部分。我提出单个查询的动机只是为了测试它是否可以完成,因为它看起来是可行的。在提交过程中使用fetchone,因为返回的id在未提交之前不会返回id。我得到的是一个“无”字