INSERT'ten sonra “id” i Python ile MySQL veritabanına nasıl alabilirim?


183

INSERT INTO deyimi yürütüyorum

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

ve birincil anahtarı almak istiyorum.

Masamın 2 sütunu var:

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

Bunu ekledikten sonra "id" i nasıl edinebilirim?


Yanıtlar:


245

Kullanım cursor.lastrowidimleç nesne üzerinde takılı son satır kimliğini almak için, ya da connection.insert_id()bu bağlantıda son Ovülden kimliğini almak için.


3
Ya iki işlem aynı bağlantıyı kullanarak aynı anda bir satır ekleme yaparsa. Hangi kimlik geri insert_iddönecek?
xiaohan2012

28
@ xiaohan2012 2 işlem aynı bağlantıyı nasıl kullanır?
hienbt88

5
Mi lastrowidgeçerli işlem işlenen sonra kullanılabilir?
John Wang

4
@ hienbt88 Muhtemelen iş parçacığı demekti, bunu yaptım ve iş parçacığı güvenliğini doğru şekilde kullanmadığınız sürece sorunlara neden olabilir. Ben şahsen her iş parçacığı için yeni bir bağlantı başlatmak için gittim, bu sevimli bir çözümdür çünkü bazı nedenlerden dolayı (aslında otomatik olarak) benim için işe yaramadı, hepsi birkaç sorgu veren birçok eşzamanlı iş parçacığı nedeniyle bazı ciddi iç içe geçtim her saniye.
Milan Velebit

Insert, select ve nerede kullanarak çoğaltılan kayıtlarla çalışmaz.
e-info128

114

Ayrıca, cursor.lastrowid(MySQLdb tarafından desteklenen bir dbapi / PEP249 uzantısı):

>>> 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.lastrowidconnection.insert_id()MySQL'e bir başka gidiş dönüşten biraz daha ucuz ve çok daha ucuzdur.


4
Neden daha cursor.lastrowiducuz connection.insert_id()?
Martin Thoma

3
Yalnızca cursor.lastrowid, cursor.execute () öğesinin bir parçası olarak imleç nesnesinde otomatik olarak ayarlandığından ve yalnızca bir özellik araması olduğu için. connection.insert_id (), daha önce çağrılmış ve sonuçları lastrowid özniteliğinde bulunan ek bir gereksiz işlev çağrısıdır.
Andrew

5
Ben sadece cursor.lastrowidfarklı bir şey döndü bir sorun yaşadım connection.insert_id(). cursor.lastrowidson ekleme kimliğini connection.insert_id()döndürdü , döndürdü 0. Nasıl olabilir?
Martin Thoma

1
@moose, belki de eşzamanlı işlemler aynı bağlantıyı kullanarak paralel veritabanı ekleme yapıyor.
xiaohan2012

1
@FlyingAtom, çünkü bu python3 yerine python2'de çalıştırıldı.
Andrew

35

Python DBAPI spec ayrıca imleç nesnesi için 'lastrowid' özniteliğini tanımlamak, yani ...

id = cursor.lastrowid

... da çalışmalı ve bağlantı başına açık bir şekilde.


7
SELECT @@IDENTITY AS 'Identity';

veya

SELECT last_insert_id();

2
sunucudan son satır kimliğini talep ettiğiniz için bu yarış koşullarına izin verir. çünkü ben, o pisliği istemiyorsun.
Joshua Burns


1
Bu bölümün eşit derecede önemli olduğunu belirtmek istiyorum: "Her istemci, istemcinin yürüttüğü son ifade için son eklenen kimliği alacaktır." Böylece, Workbench'ten select last_insert_id()bir Linux makinesinde CLI ile tam olarak aynı değerden farklı bir değer elde
edersiniz

0

Bu sadece Python PyMySql bir gereksinimi olabilir, ama ben kimliği istediğim kesin tabloyu adlandırmak zorunda bulundu:

İçinde:

cnx = pymysql.connect(host='host',
                            database='db',
                            user='user',
                            password='pass')
cursor = cnx.cursor()
update_batch = """insert into batch set type = "%s" , records = %i, started = NOW(); """
second_query = (update_batch % ( "Batch 1", 22  ))
cursor.execute(second_query)
cnx.commit()
batch_id = cursor.execute('select last_insert_id() from batch')
cursor.close()

batch_id

Çıkan: 5
... veya gerçekte doğru Batch_ID değeri ne olursa olsun


@krzys_h Bu K'ye baktığınız için teşekkürler, ancak düzenlemeniz testlerimde başarısız oldu ve bu nedenle düzenlemenizi reddettim. Düzenlemeyi de geri almayı düşünmezseniz?
Edward
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.