2012-07-27 21 views
6

¿Cómo puede obtener la ID de la última fila insertada utilizando psycopg2 en una base de datos de Greenplum?Obtenga la última identificación de fila insertada con Psycopg2 y una base de datos de Greenplum

Aquí hay varias cosas que ya he probado que no funcionan.

  • RENDIMIENTO no es compatible con Greenplum.
  • cursor.lastrowid de psycopg2 siempre devuelve 0.
  • SELECCIONAR nextval() me da la siguiente Id. De fila, pero también incrementa el contador para que la fila insertada real use una ID diferente.
  • SELECT currval() no es compatible.

Gracias de antemano.

Respuesta

0

¿SELECCIONA lastval() hacer lo que quiere?

De acuerdo con el postgres (que deduzco que GreenPlum se basa en) la documentación para Sequence Manipulation Functions debería "Devolver el valor más reciente devuelto por nextval en la sesión actual".

+0

GP no admite funciones lastval() currval() – mys

1

Creo que lo más cerca que se puede conseguir es 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 

pero last_value muestra el último valor asignado por cualquier sesión

Alternativamente, puede fila insertada colación basado en "clave primaria naturales "

No utilizaría nextval() porque las secuencias no tienen vacíos.

0

Si desea que el último ID insertado se puede hacer una búsqueda básica de SQL para el número máximo Identificación del

+0

Ésta es una solución no válida. no funcionará en aplicaciones concurrentes. – AbiusX

+0

El OP no puso esa restricción – 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] 

Debe intentar algo como esto para resolver su problema por lo que es algo genérico.

Cuestiones relacionadas