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


176

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

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

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

जवाबों:


256

आप कर्सर का उपयोग कर सकते हैं। रिज़ॉर्ट (देखें "वैकल्पिक DB एपीआई एक्सटेंशन"):

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

यदि दो लोग एक ही समय में सम्मिलित कर रहे हैं, जब तक वे अलग-अलग cursors का उपयोग कर रहे हैं , तब तक डाली गई अंतिम पंक्ति cursor.lastrowidके idलिए वापस आ जाएंगे 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वापस लौटते हैं :Noneexecutemany

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

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

43
last_insert_rowid()SQL फ़ंक्शन भी है , जो आपको अगली प्रविष्टि स्टेटमेंट में एक विदेशी कुंजी के रूप में अंतिम पंक्ति आईडी सम्मिलित करने की अनुमति देता है , पूरी तरह से SQL में।
मार्टिन पीटर्स

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

3
प्रतीत होता है कि पायथन का स्क्वैलाइट 3 अंतिम उपयोग में github.com/ghaering/pysqlite/blob/… (जो थ्रेडसेफ़ की गारंटी नहीं है, लेकिन एकमात्र विकल्प FWIW लगता है) के last_insert_rowidनीचे का उपयोग करता है । यह भी देखें stackoverflow.com/q/2127138/32453
rogerdpack

2
Btw, यह काम करता है INSERTलेकिन इसके लिए काम नहीं करता है UPDATE। लेकिन एक पंक्ति को अद्यतन करते समय, आपके पास संभवतः पहले से ही संबंधित आईडी आईडी है (बस मुझे यह पता लगाने में थोड़ा समय लगा ...)।
CGFoX

4

टिप्पणी में @Martijn पीटर को सभी क्रेडिट :

आप फ़ंक्शन का उपयोग कर सकते हैं last_insert_rowid():

last_insert_rowid()फ़ंक्शन ROWIDडेटाबेस कनेक्शन जो समारोह लागू से अंतिम पंक्ति डालने की। last_insert_rowid()एसक्यूएल समारोह के चारों ओर एक आवरण है sqlite3_last_insert_rowid()C / C ++ इंटरफ़ेस समारोह।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.