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

时间:2012-07-27 23:17:00

标签: sql postgresql psycopg2 greenplum

如何在Greenplum数据库上使用psycopg2获取最后插入的行的ID?

以下是我已经尝试过的几件不起作用的事情。

  • Greenplum不支持RETURNING。
  • psycopg2的cursor.lastrowid始终返回0.
  • SELECT nextval()为我提供了下一行id,但也增加了计数器,因此实际插入的行使用不同的id。
  • 不支持SELECT currval()。

提前致谢。

4 个答案:

答案 0 :(得分: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 :(得分: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]

你应该尝试这样的方法来解决你的问题,使其有些通用。

答案 2 :(得分:0)

SELECT lastval()能做你想做的吗?

根据postgres(我收集的是GreenPlum所依据的)Sequence Manipulation Functions的文档,它应该“返回当前会话中nextval最近返回的值。”

答案 3 :(得分:0)

如果您希望插入最后一个ID,则可以对最大ID号进行基本的SQL搜索