2012-07-27 13 views
6

Greenplumデータベースでpsycopg2を使用して最後に挿入された行のIDを取得するにはどうすればよいですか?Psycopg2とGreenplumデータベースで最後に挿入された行IDを取得

私がすでに試したことがありますが、これはうまくいきません。

  • RETURNINGはGreenplumではサポートされていません。
  • psycopg2のcursor.lastrowidは常に0を返します。
  • SELECT nextval()は次の行IDを返しますが、実際に挿入された行が別のIDを使用するようにカウンタをインクリメントします。
  • SELECT currval()はサポートされていません。

ありがとうございます。

答えて

0

SELECT lastval()は必要な操作を行いますか?

Sequence Manipulation Functionsのpostgres(私がGreenPlumをベースにしています)のドキュメントによると、「現在のセッションでnextvalが最後に返す値を返す」べきです。

+0

GPはlastval()currval()関数をサポートしていません – mys

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が挿入された場合、あなたはそれがやや総称することによって、あなたの問題を解決するために、このような何かを試してみてください最大ID番号

+0

これは無効な解決方法です。並行アプリケーションでは機能しません。 – AbiusX

+0

OPはその制約を置かなかった – Medeiros

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] 

のための基本的なSQL検索を行うことができます。

関連する問題