使用Psycopg2和Greenplum数据库获取最后插入的行ID

6
如何在Greenplum数据库上使用psycopg2获取最后插入行的ID?
下面是我已经尝试过但不起作用的几种方法:
- RETURNING不受Greenplum支持。 - Psycopg2的cursor.lastrowid始终返回0。 - SELECT nextval()给出了下一行的ID,但也增加了计数器,因此实际插入的行使用不同的ID。 - SELECT currval()不受支持。
谢谢。
4个回答

1

我认为你能得到的最接近的结果是 select * from seq_name

dwh=# select * from queue_id_seq;
 sequence_name | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called 
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 queue_id_seq  |        127 |            1 | 9223372036854775807 |         1 |           1 |      32 | f         | t

但是last_value显示的是任何会话分配的最后一个值

或者,您可以基于“自然主键”读回插入的行

我不会使用nextval(),因为序列不是无间隔的。


1
def last_insert_id(cursor, table_name, pk_name):
    sequence = "{table_name}_{pk_name}_seq".format(table_name=table_name,
                                                       pk_name=pk_name)
    cursor.execute("SELECT last_value from {sequence}".format(sequence=sequence))
    return cursor.fetchone()[0]

你可以尝试类似这样的方法来解决问题,使其更通用。

0

SELECT lastval()是否符合你的需求?

根据postgres(我了解GreenPlum是基于此的)序列操作函数文档的说明,它应该“返回当前会话中由nextval最近返回的值”。


GP不支持lastval()和currval()函数。 - mys

-1
如果您想获取最后插入的ID,可以通过基本的SQL搜索获取最大的ID号。

这个解决方案是无效的。它在并发应用中无法工作。 - AbiusX
OP没有设置这个约束 - Medeiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接