2011-06-05 14 views
116

Python'u kullanarak SQLite'de satır ekledikten sonra eklenen kimlik nasıl alınır? Böyle bir tablo var: Python'u kullanarak SQLite'de satır ekledikten sonra eklenen kimlik nasıl alınır?

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

Ben örnek veri username="test" ve password="test" ile yeni bir satır ekleyin. Oluşturulan kimliği nasıl güvenli bir şekilde geri alabilirim? Bu, iki kişinin aynı anda veri ekleyebileceği bir web sitesi çözümü içindir. Son okuma sırasını bulabildiğimi biliyorum ama bunun güvenli olduğunu düşünmüyorum. Birisi bana biraz tavsiye verebilir mi?

cevap

180

Sen cursor.lastrowid ("İsteğe Bağlı DB API Uzantıları" bakın) kullanabilirsiniz:

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 

farklı cursor s kullanarak gibi iki kişi sürece, aynı anda ekleme yapıyorsanız, cursor.lastrowidid dönecektir cursor eklenen son satır için:

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 

Not olduğunu lastrowid döner size birden fazla satır ekleyin None Bireysel imleç örneğinin en son kimliğini döndüreceğini açıklamak için executemany:

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

+1. – quakkels

+24

Ayrıca, son satır kimliğini * sonraki * ekinde bir yabancı anahtar olarak eklemenize olanak veren ['last_insert_rowid()' SQL işlevi] (http://www.sqlite.org/lang_corefunc.html#last_insert_rowid) da vardır. deyim, tamamen SQL'de. –

+1

@MartijnPieters Bunu bir cevap olarak gönderebilirsiniz, soru oldukça eski olmasına rağmen. Kullanıcıların bu sayfayı okumalarına hala yardımcı olabilir. –

İlgili konular