2010-03-30 17 views
122

eseguo un INSERT INTOCome posso ottenere "id" dopo aver INSERITO nel database MySQL con Python?

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

e voglio ottenere la chiave primaria.

Il mio tavolo ha 2 colonne:

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

Come faccio ad avere il "id", dopo che ho appena inserito questo?

+0

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

risposta

158

Utilizzare cursor.lastrowid per ottenere l'ultimo ID riga inserito sull'oggetto cursore o connection.insert_id() per ottenere l'ID dall'ultimo inserimento su quella connessione.

+1

Cosa succede se due processi che inseriscono una riga allo stesso tempo usando la stessa connessione. Quale ID restituirà 'insert_id'? – xiaohan2012

+17

@ xiaohan2012 In che modo 2 processi utilizzano la stessa connessione? – hienbt88

+3

'lastrowid' è disponibile solo dopo il commit della transazione corrente? –

3
SELECT @@IDENTITY AS 'Identity'; 

o

SELECT last_insert_id(); 
+2

questo consente condizioni di gara perché stai richiedendo l'ultimo ID riga dal server. perché io, tu non vuoi quel casino. –

+7

[Per LAST_INSERT_ID(), l'ID generato più di recente viene mantenuto nel server in base alla connessione. Non è cambiato da un altro client.] (Http://dev.mysql.com/doc/refman/5.5/en/getting-unique-id.html) – Keith

+1

Voglio sottolineare che questa parte è altrettanto importante: " Ogni cliente riceverà l'ultimo ID inserito per l'ultima istruzione eseguita dal client. " Quindi otterrete un valore diverso da Workbench rispetto all'esecuzione dello stesso identico 'select last_insert_id()' dalla CLI su una macchina Linux – simplycoding

96

Inoltre, cursor.lastrowid (un'estensione dbapi/PEP249 sostenuto da 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 è un po 'meno rispetto connection.insert_id() e molto più conveniente rispetto ad un altro di andata e ritorno a MySQL.

+2

Perché 'cursor.lastrowid' è più economico di' connection.insert_id() '? –

+2

Solo perché cursor.lastrowid viene automaticamente impostato sull'oggetto cursore come parte di cursor.execute() ed è solo una ricerca di attributi. connection.insert_id() è una chiamata di funzione non necessaria aggiuntiva, una che è già stata chiamata e il cui risultato è disponibile sull'attributo lastrowid. – Andrew

+1

Ho appena avuto un problema in cui 'cursor.lastrowid' ha restituito qualcosa di diverso da' connection.insert_id() '. 'cursor.lastrowid' ha restituito l'ultimo ID di inserimento,' connection.insert_id() 'ha restituito' 0'. Come può essere? –

30

Python DBAPI spec anche definire 'lastrowid' attributo per oggetto cursore, quindi ...

id = cursor.lastrowid 

... dovrebbe funzionare anche, ed è per-connessione basata ovviamente.

+4

questa è la risposta più appropriata. –

Problemi correlati