2012-07-27 20 views
6

Come si può ottenere l'ID dell'ultima riga inserita utilizzando psycopg2 su un database Greenplum?Ottieni l'ultimo ID riga inserito con Psycopg2 e un database Greenplum

Qui ci sono diverse cose che ho già provato che non funzionano.

  • RETURNING non è supportato da Greenplum.
  • cursor.lastrowid di psycopg2 restituisce sempre 0.
  • SELECT nextval() mi dà l'id della riga successiva, ma incrementa anche il contatore in modo che la riga inserita effettiva utilizzi un ID diverso.
  • SELECT currval() non è supportato.

Grazie in anticipo.

risposta

0

Does SELECT lastval() fa ciò che vuoi?

In base al postgres (su cui sono basato GreenPlum) sulla documentazione per Sequence Manipulation Functions, è necessario "Restituire il valore restituito più recentemente da nextval nella sessione corrente."

+0

GP non supporta le funzioni lastval() currval() – mys

1

Credo che il più vicino si può ottenere è 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 

ma last_value mostra l'ultimo valore assegnato da qualsiasi sessione di

In alternativa, è possibile fila di read-back inserita sulla base di chiave "naturale primaria "

Non utilizzerei nextval() perché le sequenze non sono vuote.

0

Se si desidera che l'ultimo ID inserito si può fare una ricerca di base SQL per il numero massimo di id

+0

Questa è una soluzione non valida. non funzionerà in applicazioni concorrenti. – AbiusX

+0

L'OP non ha inserito questo vincolo – 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] 

Si dovrebbe provare qualcosa di simile per risolvere il tuo problema, rendendo un po 'generico.