2010-03-30 3 views
122

J'exécute une instruction INSERT INTOComment obtenir le "id" après INSERT dans la base de données MySQL avec Python?

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

et je veux obtenir la clé primaire.

Ma table a 2 colonnes:

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

Comment puis-je obtenir le "id", après que je vient d'être inséré cela?

+0

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

Répondre

158

Utilisez cursor.lastrowid pour obtenir l'ID de la dernière ligne insérée sur l'objet curseur ou connection.insert_id() pour obtenir l'ID de la dernière insertion sur cette connexion.

+1

Que faire si deux processus insérant une ligne en même temps en utilisant la même connexion. Quel identifiant renverra 'insert_id'? – xiaohan2012

+17

@ xiaohan2012 Comment 2 processus utilisent-ils la même connexion? – hienbt88

+3

Est-ce que 'lastrowid' est disponible uniquement après la validation de la transaction en cours? –

3
SELECT @@IDENTITY AS 'Identity'; 

ou

SELECT last_insert_id(); 
+2

cela permet des conditions de course parce que vous demandez l'identifiant de la dernière ligne du serveur. parce que moi, tu ne veux pas de ce gâchis. –

+7

[Pour LAST_INSERT_ID(), l'ID généré le plus récemment est conservé sur le serveur par connexion. Ce n'est pas changé par un autre client.] (Http://dev.mysql.com/doc/refman/5.5/en/getting-unique-id.html) – Keith

+1

Je tiens à souligner que cette partie est tout aussi importante: " Chaque client recevra le dernier identifiant inséré pour la dernière déclaration exécutée par le client. " Vous obtiendrez donc une valeur différente de celle de Workbench plutôt que d'exécuter exactement la même chose 'select last_insert_id()' depuis la CLI sur une machine Linux – simplycoding

96

En outre, cursor.lastrowid (extension DBAPI/PEP249 pris en charge par 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 est un peu moins cher que connection.insert_id() et beaucoup moins cher qu'un autre voyage aller-retour à MySQL

+2

Pourquoi 'cursor.lastrowid' est-il moins cher que' connection.insert_id() '? –

+2

Seulement parce que cursor.lastrowid est automatiquement défini sur l'objet curseur dans le cadre de cursor.execute() et est juste une recherche d'attribut. connection.insert_id() est un appel de fonction inutile supplémentaire - un qui a déjà été appelé et dont le résultat est disponible sur l'attribut lastrowid. – Andrew

+1

J'ai juste eu un problème où 'cursor.lastrowid' a retourné quelque chose de différent de' connection.insert_id() '. 'cursor.lastrowid' a renvoyé le dernier identifiant d'insertion,' connection.insert_id() 'a renvoyé' 0'. Comment cela peut-il être? –

30

Python DBAPI spec définissent aussi 'lastrowid' attribut pour objet curseur, alors ...

id = cursor.lastrowid 

... devraient fonctionner aussi, et il est par connexion à base évidemment.

+4

c'est la réponse la plus appropriée. –

Questions connexes