2009-04-01 9 views
15

Tengo una tabla sencilla en MySQL con los siguientes campos:¿Cómo se obtiene de manera segura y eficiente la identificación de la fila después de una inserción con mysql usando MySQLdb en python?

  • ID - Clave primaria, int, autoincrement
  • nombre - varchar (50)
  • descripción - varchar (256)

Usando MySQLdb, un módulo de python, quiero insertar un nombre y una descripción en la tabla, y recuperar el ID.

En pseudocódigo:

db = MySQLdb.connection(...) 
queryString = "INSERT into tablename (name, description) VALUES" % (a_name, a_desc);" 

db.execute(queryString); 
newID = ??? 
+0

duplicados de [¿Cómo consigo el valor de identidad/Autonumber para la fila me inserta en pymysql] (http://stackoverflow.com/questions/6802061/ how-do-i-get-the-identity-autonumber-value-for-the-row-i-inserted-in-pymysql), que es un mejor par de Q & A; este tiene una respuesta incorrecta aceptada con la respuesta correcta editada debajo, lo cual es extraño e inútil. –

Respuesta

27

yo creo que puede ser

newID = db.insert_id() 

Editar por el cartel original

Resulta que, en la versión de MySQLdb que soy usando (1.2.2) Haría lo siguiente:

conn = MySQLdb(host...) 

c = conn.cursor() 
c.execute("INSERT INTO...") 
newID = c.lastrowid 

Estoy dejando esto como la respuesta correcta, ya que me apuntó en la dirección correcta.

+0

Haga esto * antes * de la confirmación, si no se está comprometiendo automáticamente. – kmarsh

+0

@kmarsh Sé que este comentario es muy antiguo, pero ¿recuerdas por qué debería ser antes de la confirmación? –

+0

Supongo que porque el código se hace con el cursor, y perderá contexto después de la confirmación. Respuesta más breve, funcionó mejor para mí de esa manera. – kmarsh

-7

La manera más fácil de todo es envolver su inserción con una consulta de selección de conteos en un único procedimiento almacenado y llamar eso en su código. Pasaría los parámetros necesarios para el procedimiento almacenado y luego seleccionaría su conteo de filas.

+1

-1 por no usar la funcionalidad MySQL incorporada – epochwolf

+1

-1 para anteponer todo eso con "la forma más fácil" – Eloff

+2

-1 para lo anterior y el hecho de que se perdió el barco. – Justin

2

No sé si hay una API específica MySQLdb para esto, pero en general se puede obtener la última ID insertado por SELECTing LAST_INSERT_ID()

Está en una base por conexión, por lo que no corre el riesgo de raza condiciones si algún otro cliente realiza una inserción también.

0

También puede hacer un

conn.insert_id

Cuestiones relacionadas