如何使用python在postgres中获取插入或选定的行id
我的postgres查询是:如何使用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
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。我得到的是一个“无”字