2009-04-01 10 views
15

Mam proste tabeli w mysql z następujących dziedzin:Jak bezpiecznie i sprawnie uzyskać identyfikator wiersza po wstawieniu z mysql przy użyciu MySQLdb w python?

  • ID - klucz podstawowy, int autoIncrement
  • nazwa - varchar (50)
  • opis - varchar (256)

Korzystając z MySQLdb, modułu Pythona, chcę wstawić nazwę i opis do tabeli i odzyskać identyfikator.

W Pseudokod:

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

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

duplikat [Jak mogę uzyskać wartość IDENTITY/AutoNumber dla wiersza I włożonej pymysql] (http://stackoverflow.com/questions/6802061/ how-do-i-get-the-identity-autonumber-value-for-the-the-row-i-insert-in-pymysql), która jest lepszą parą pytań i odpowiedzi; ten ma błędną odpowiedź akceptowaną z poprawną odpowiedzią podaną poniżej, co jest dziwne i niepomocne. –

Odpowiedz

27

myślę, że może to być

newID = db.insert_id() 

Edycja przez Plakat oryginalny

Okazuje się, że w wersji MySQLdb, że jestem za pomocą (1.2.2) Użytkownik może wykonać następujące czynności:

conn = MySQLdb(host...) 

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

Pozostawiam to jako poprawną odpowiedź, ponieważ skierowało mnie we właściwym kierunku.

+0

Zrób to * przed * zatwierdzeniem, jeśli nie zatwierdzasz automatycznie. – kmarsh

+0

@kmarsh Wiem, że ten komentarz jest bardzo stary, ale czy pamiętasz, dlaczego to powinno być przed zatwierdzeniem? –

+0

Zgaduję, ponieważ kod jest wykonywany za pomocą kursora i utraci kontekst po zatwierdzeniu. Krótsza odpowiedź, w moim przypadku sprawdziła się lepiej. – kmarsh

-7

Najłatwiejszym sposobem jest owinięcie wstawki za pomocą kwerendy liczby mnogiej w pojedynczą procedurę składowaną i wywołanie jej w kodzie. Przekazałbyś parametry potrzebne do procedury przechowywanej, a następnie wybrałbyś liczbę wierszy.

+1

-1 za niewykorzystanie wbudowanej funkcji MySQL – epochwolf

+1

-1 dla prefiksowania wszystkiego z "najprostszym sposobem" – Eloff

+2

-1 dla powyższego oraz z faktu, że tęskniłeś za łodzią. – Justin

2

Nie wiem, czy jest specyficzny dla MySQLdb API, ale ogólnie można uzyskać ostatni zapisany identyfikator przez SELECTing LAST_INSERT_ID()

To jest na podstawie na połączenia, więc nie ryzykować wyścig warunki, jeśli jakiś inny klient wykonuje również wstawkę.

0

Można również zrobić

conn.insert_id

Powiązane problemy