2010-03-30 19 views
122

que ejecutar una instrucción INSERT INTO¿Cómo obtengo el "id" después de INSERTAR en la base de datos MySQL con Python?

cursor.execute("INSERT INTO mytable(height) VALUES(%s)",(height)) 

y quiero obtener la clave primaria.

Mi tabla tiene 2 columnas:

id  primary, auto increment 
height this is the other column. 

¿Cómo consigo el "id", después de que acaba de insertar esto?

+0

http://stackoverflow.com/questions/706755/how-do-you-safely-and-efficiently-get-the-row-id-after-an-insert-with-mysql-usin – pmav99

Respuesta

158

Utilice cursor.lastrowid para obtener la última fila ID insertada en el objeto de cursor, o connection.insert_id() para obtener la ID de la última inserción en esa conexión.

+1

¿Qué pasa si dos procesos insertando una fila al mismo tiempo usando la misma conexión. ¿Qué id va a devolver 'insert_id'? – xiaohan2012

+17

@ xiaohan2012 ¿Cómo dos procesos usan la misma conexión? – hienbt88

+3

¿'lastrowid' solo está disponible después de que se haya confirmado la transacción actual? –

3
SELECT @@IDENTITY AS 'Identity'; 

o

SELECT last_insert_id(); 
+2

esto permite condiciones de carrera porque está solicitando la última identificación de fila del servidor. porque yo, tú no quieres ese desastre. –

+7

[Para LAST_INSERT_ID(), la ID generada más recientemente se mantiene en el servidor por conexión. No es cambiado por otro cliente.] (Http://dev.mysql.com/doc/refman/5.5/en/getting-unique-id.html) – Keith

+1

Quiero señalar que esta parte es igualmente importante: " Cada cliente recibirá la última identificación insertada para la última declaración ejecutada por el cliente ". Por lo tanto, obtendrás un valor diferente de Workbench que ejecutar exactamente el mismo 'seleccionar last_insert_id()' de la CLI en una máquina Linux – simplycoding

96

Además, cursor.lastrowid (una extensión dbapi/PEP249 apoyado por MySQLdb):

>>> import MySQLdb 
>>> connection = MySQLdb.connect(user='root') 
>>> cursor = connection.cursor() 
>>> cursor.execute('INSERT INTO sometable VALUES (...)') 
1L 
>>> connection.insert_id() 
3L 
>>> cursor.lastrowid 
3L 
>>> cursor.execute('SELECT last_insert_id()') 
1L 
>>> cursor.fetchone() 
(3L,) 
>>> cursor.execute('select @@identity') 
1L 
>>> cursor.fetchone() 
(3L,) 

cursor.lastrowid es algo más barato que connection.insert_id() y mucho más barato que otro de ida y vuelta a MySQL.

+2

¿Por qué 'cursor.lastrowid' es más barato que' connection.insert_id() '? –

+2

Solo porque cursor.lastrowid se establece automáticamente en el objeto de cursor como parte de cursor.execute() y es solo una búsqueda de atributos. connection.insert_id() es una llamada de función innecesaria adicional, una llamada que ya se ha llamado y cuyo resultado está disponible en el atributo lastrowid. – Andrew

+1

Acabo de tener un problema donde 'cursor.lastrowid' devolvió algo diferente que' connection.insert_id() '. 'cursor.lastrowid' devolvió la última identificación de inserción,' connection.insert_id() 'returned' 0'. ¿Como puede ser? –

30

Python DBAPI también definir spec 'lastrowid' atributo de objeto de cursor, así que ...

id = cursor.lastrowid 

... debería funcionar también, y es por conexión basada obviamente.

+4

esta es la respuesta más adecuada. –

Cuestiones relacionadas