2012-07-27 91 views
6

如何獲取在Greenplum數據庫上使用psycopg2插入的最後一行的ID?獲取最後插入的行ID與Psycopg2和Greenplum數據庫

下面是我已經嘗試過的幾件事情,不起作用。

  • Greenplum不支持RETURNING。
  • psycopg2的指針.lastrowid始終返回0.
  • SELECT nextval()給我下一行id,但也遞增計數器,因此實際插入的行使用不同的id。
  • 不支持SELECT currval()。

在此先感謝。

回答

0

SELECT lastval()做你想要的嗎?

根據postgres(我收集GreenPlum基於)Sequence Manipulation Functions的文檔,它應該「返回當前會話中最近由nextval返回的值」。

+0

GP不支持lastval()currval()函數 – mys 2012-11-16 13:41:07

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(),因爲序列沒有間隙。

0

如果你想在最後一個ID插入,你可以做一個基本的SQL搜索最大的ID號

+0

這是一個無效的解決方案。它不會在併發應用程序中工作。 – AbiusX 2016-01-31 02:47:47

+0

OP沒有提出這個約束 – Medeiros 2016-02-01 13:19:58

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] 

你應該嘗試這樣的事情通過使有些通用的解決你的問題。

相關問題