2011-06-05 6 views
116

पायथन का उपयोग कर SQLite में पंक्ति डालने के बाद डाली गई आईडी को कैसे पुनर्प्राप्त करें? मैं इस तरह की मेज है:पायथन का उपयोग कर SQLite में पंक्ति डालने के बाद डाली गई आईडी को कैसे पुनर्प्राप्त करें?

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

मैं उदाहरण डेटा username="test" और password="test" के साथ एक नई पंक्ति सम्मिलित। लेनदेन में सुरक्षित आईडी को मैं सुरक्षित तरीके से कैसे प्राप्त करूं? यह एक वेबसाइट समाधान के लिए है, जहां दो लोग एक ही समय में डेटा डालने वाले हो सकते हैं। मुझे पता है कि मुझे अंतिम पढ़ने वाली पंक्ति मिल सकती है, लेकिन मुझे नहीं लगता कि यह लेनदेन सुरक्षित है। क्या कोई मुझे कुछ सलाह दे सकता है?

उत्तर

180

आप इस्तेमाल कर सकते हैं cursor.lastrowid ("वैकल्पिक डीबी एपीआई एक्सटेंशन" देखें):

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 

दो लोगों को एक ही समय में डालने कर रहे हैं, जब तक कि वे अलग cursor रों उपयोग कर रहे हैं, cursor.lastrowidid वापस आ जाएगी अंतिम पंक्ति कि cursor डाला के लिए:

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 

ध्यान दें कि lastrowid रिटर्न None जब आप में एक से अधिक पंक्ति सम्मिलित executemany के साथ एक समय:

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

+1 यह समझाने के लिए कि वह उस व्यक्तिगत कर्सर उदाहरण द्वारा सबसे हालिया आईडी वापस कर देगा। – quakkels

+24

['last_insert_rowid() 'एसक्यूएल फ़ंक्शन] (http://www.sqlite.org/lang_corefunc.html#last_insert_rowid) भी है, जो आपको * अगली * डालने में एक विदेशी कुंजी के रूप में अंतिम पंक्ति आईडी डालने की अनुमति देता है कथन, पूरी तरह से एसक्यूएल में। –

+1

@MartijnPieters आप इसे एक उत्तर के रूप में पोस्ट कर सकते हैं, भले ही सवाल काफी पुराना हो। यह अभी भी संभावित रूप से उपयोगकर्ताओं को इस पृष्ठ को पढ़ने में मदद करेगा। –

संबंधित मुद्दे

 संबंधित मुद्दे