পাইথন ব্যবহার করে এসকিউএলাইটে সারি সন্নিবেশ করানোর পরে sertedোকানো আইডি কীভাবে পুনরুদ্ধার করবেন?


176

পাইথন ব্যবহার করে এসকিউএলাইটে সারি সন্নিবেশ করানোর পরে sertedোকানো আইডি কীভাবে পুনরুদ্ধার করবেন? আমার মতো টেবিল রয়েছে:

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

আমি উদাহরণস্বরূপ ডেটা username="test"এবং সহ একটি নতুন সারি .োকান password="test"। আমি কীভাবে লেনদেন নিরাপদ উপায়ে উত্পন্ন আইডি পুনরুদ্ধার করব? এটি কোনও ওয়েবসাইট সমাধানের জন্য, যেখানে একই সময়ে দু'জন লোক ডেটা beোকাতে পারে। আমি জানি আমি শেষ পঠিত সারিটি পেতে পারি তবে আমি মনে করি না এটি লেনদেন নিরাপদ। কেউ আমাকে কিছু পরামর্শ দিতে পারেন?

উত্তর:


256

আপনি কার্সার.স্ট্রয়েড ব্যবহার করতে পারেন (" Dচ্ছিক ডিবি এপিআই এক্সটেনশানগুলি" দেখুন):

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গুলি ব্যবহার করে , শেষ সারিটি theোকানো শেষটি cursor.lastrowidফিরে আসবে :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

দ্রষ্টব্য যে আপনি যখন একবারে একাধিক সারি sert lastrowidোকান Noneতখন ফিরে আসে executemany:

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

16
এটি পৃথক কার্সার উদাহরণ দ্বারা সাম্প্রতিকতম আইডি ফিরিয়ে দেবে তা বোঝানোর জন্য +1।
কোক্কেলস

43
রয়েছে last_insert_rowid()এসকিউএল ফাংশন , আপনি একটি একটি বিদেশী কী-এর মত শেষ সারি আইডি সন্নিবেশ করতে সক্ষম হবেন পরবর্তী , সন্নিবেশ করুন বিবৃতি সম্পূর্ণভাবে SQL এর যে।
মার্টিজন পিটারস

2
@ মার্তিজজনপিটার্স প্রশ্নটি পুরানো হলেও আপনি উত্তর হিসাবে পোস্ট করতে পারেন। এটি এখনও ব্যবহারকারীদের এই পৃষ্ঠাটি পড়তে সম্ভাব্যভাবে সহায়তা করবে।
ড্যানিয়েল ওয়ার্নার 21

3
পাইথনের স্ক্য্লাইট 3 লাস্ট্রোয়েড github.com/ghaering/pysqlite/blob/… এর last_insert_rowidনীচে ব্যবহার করে (যা থ্রেডসেফের গ্যারান্টিযুক্ত নয় তবে একমাত্র বিকল্প FWIW বলে মনে হচ্ছে)। আরও দেখুন stackoverflow.com/q/2127138/32453
rogerdpack

2
বিটিডব্লিউ, এটি কাজ করে INSERTতবে কাজ করে না UPDATE। তবে কোনও সারি আপডেট করার সময় আপনার সম্ভবত ইতিমধ্যে সম্পর্কিত সারি আইডি রয়েছে (এটি খুঁজে পেতে আমাকে কিছুটা সময় নিল ...)।
সিজিএফএক্স ২

4

মন্তব্যগুলিতে @ মার্তিজন পিটারকে সমস্ত ক্রেডিট :

আপনি ফাংশনটি ব্যবহার করতে পারেন last_insert_rowid():

last_insert_rowid()ফাংশনটি ROWIDডাটাবেস সংযোগ যা ফাংশন প্রার্থনা থেকে শেষ সারি সন্নিবেশ করুন। last_insert_rowid()এসকিউএল ফাংশন কাছাকাছি একটি লেফাফা হয় sqlite3_last_insert_rowid()সি / সি ++ ইন্টারফেস ফাংশন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.