Python kullanarak SQLite satır ekledikten sonra eklenen kimliği almak nasıl?


176

Python kullanarak SQLite satır ekledikten sonra eklenen kimliği almak nasıl? Ben böyle bir tablo var:

id INT AUTOINCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)

Örnek verilerle yeni bir satır ekliyorum username="test"ve password="test". Oluşturulan kimliği güvenli bir şekilde nasıl alabilirim? Bu, iki kişinin aynı anda veri ekleyebileceği bir web sitesi çözümü içindir. Son okuma satırını alabileceğimi biliyorum, ama bunun işlem için güvenli olduğunu düşünmüyorum. Birisi bana tavsiyede bulunabilir mi?

Yanıtlar:


256

Cursor.lastrowid kullanabilirsiniz (bkz. "İsteğe bağlı DB API Uzantıları"):

connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,
                                    username varchar(50),
                                    password varchar(50))''')
cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',
               ('test','test'))
print(cursor.lastrowid)
# 1

İki kişi aynı anda eklerse, farklı cursors kullandıkları sürece , eklenen son satır için cursor.lastrowiddöndürür :idcursor

cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',
               ('blah','blah'))

cursor2=connection.cursor()
cursor2.execute('INSERT INTO foo (username,password) VALUES (?,?)',
               ('blah','blah'))

print(cursor2.lastrowid)        
# 3
print(cursor.lastrowid)
# 2

cursor.execute('INSERT INTO foo (id,username,password) VALUES (?,?,?)',
               (100,'blah','blah'))
print(cursor.lastrowid)
# 100

Aşağıdakilerle aynı anda birden fazla satır eklediğinizde lastrowiddöndürüleceğini unutmayın :Noneexecutemany

cursor.executemany('INSERT INTO foo (username,password) VALUES (?,?)',
               (('baz','bar'),('bing','bop')))
print(cursor.lastrowid)
# None

16
Tek tek imleç örneği tarafından en son kimliği döndüreceğini açıklamak için +1.
quakkels

43
Ayrıca, son satır kimliğini yabancı anahtar olarak bir sonraki ekleme ifadesine tamamen SQL'de eklemenize izin veren last_insert_rowid()SQL işlevi de vardır .
Martijn Pieters

2
@MartijnPieters Soru oldukça eski olmasına rağmen bunu bir cevap olarak gönderebilirsiniz. Hala bu sayfayı okuyan kullanıcılara yardımcı olabilir.
Daniel Werner

3
Python'un Sqlite3 lastrowid kullanımlarını görünür last_insert_rowidaltına github.com/ghaering/pysqlite/blob/... (threadsafe garantili ama sadece bir seçenek FWIW görünüyor değildir). Ayrıca bkz. Stackoverflow.com/q/2127138/32453
rogerdpack

2
Btw, bu işe yarıyor INSERTama işe yaramıyor UPDATE. Ancak bir satırı güncellerken, muhtemelen zaten zaten ilgili satır kimliğine sahipsiniz (sadece bunu anlamak için biraz zamanımı aldı ...).
CGFoX

4

Yorumlarda @Martijn Pieters'a verilen tüm krediler :

İşlevi kullanabilirsiniz last_insert_rowid():

last_insert_rowid()İşlevin döndürdüğü ROWIDişlevi çağrılır veritabanı bağlantısından son satırın ekin. last_insert_rowid()SQL işlevi etrafında sarıcı sqlite3_last_insert_rowid()C / C ++ arayüz fonksiyonu.

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.