2011-12-21 174 views
13

Estoy usando SQLAlchemy sin el ORM, es decir, usando estados de SQL a mano para interactuar directamente con el backend db. Estoy usando PG como mi backend db (psycopg2 como controlador de base de datos) en este caso, no sé si eso afecta la respuesta.SqlAlchemy: obteniendo el id del último registro insertado

que tienen declaraciones como esta (por razones de brevedad, se asume que conn es una conexión válida a la db):

conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 

Supongamos también que la tabla de usuario se compone de las columnas (id [CLAVE PRIMARIA DE SERIE], nombre, country_id)

¿En qué puedo obtener el ID del nuevo usuario (a ser posible, sin golpear el PP de nuevo?)

+0

¿Qué tiene esto que ver con SQLAlchemy? –

Respuesta

14

Usted puede ser capaz de utilizar el RETURNING cláusula del INSERT statement así:

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING *") 

Si sólo desea que el resultado id:

rslt_id = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING id") 
+1

Definitivamente lo que necesitaba. El objeto devuelto era un ResultProxy en ambos casos, así que tuve que modificar el código un poco (llamando a fetchone()) para que funcione. –

+7

Alternativamente, 'user.insert(). Returning (user.c.id) .values ​​({'name': 'Homer', 'country_id': 123})' – Pakman

+0

Esta solución no funciona con 'sqlite'. Resulta en 'sqlalchemy.exc.CompileError: RETURNING no es compatible con la compilación de declaración de este dialecto''. La otra solución ('lastrowid') funciona en ese caso. –

13

usuario lastrowid

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 
result.lastrowid 
+3

Esto no funciona con PG db usando un controlador psycopg2. –

+0

Lo siento, no tengo pgsql en mi escritorio, utilicé mysql :) – Nilesh

+6

Más específicamente, no funciona con tablas sin oid, que actualmente es el predeterminado. Y de todos modos, a menudo no es lo que estás buscando: RETURNING es una solución superior. – piro

0

actual SQLAlchemy documentation sugiere

result.inserted_primary_key ¡Deberia trabajar!

Cuestiones relacionadas