পাইথনের সাথে মাইএসকিউএল ডাটাবেসে ইনসার্টের পরে আমি কীভাবে "আইডি" পাব?


182

আমি একটি INSERT INTO বিবৃতি কার্যকর করি

cursor.execute("INSERT INTO mytable(height) VALUES(%s)",(height))

এবং আমি প্রাথমিক কীটি পেতে চাই।

আমার টেবিলটিতে 2 টি কলাম রয়েছে:

id      primary, auto increment
height  this is the other column.

আমি কেবল এটি inোকানোর পরে কীভাবে "আইডি" পাব?


উত্তর:


243

ব্যবহার করুন cursor.lastrowidশেষ সারি আইডি কার্সার বস্তুর উপর সন্নিবেশিত পেতে, বা connection.insert_id()যে সংযোগ গত সন্নিবেশ থেকে ID জন্য।


3
যদি একই সংযোগটি ব্যবহার করে একই সাথে দুটি সারি সন্নিবেশ করানো হয় তবে কী হবে। কোন আইডি insert_idফিরবে?
xiaohan2012

26
@ xiaohan2012 2 টি প্রক্রিয়া কীভাবে একই সংযোগ ব্যবহার করবে?
hienbt88

5
Is lastrowidপর বর্তমান লেনদেনের সংঘটিত হচ্ছে শুধুমাত্র উপলব্ধ?
জন ওয়াং

4
@ hienbt88 তিনি সম্ভবত থ্রেডগুলি বোঝাতে চেয়েছিলেন, আমি এটি করেছি এবং এটি থ্রেডস্টিটি সঠিকভাবে ব্যবহার না করা হলে এটি সমস্যার কারণ হতে পারে। আমি ব্যক্তিগতভাবে প্রতিটি থ্রেডের জন্য একটি নতুন সংযোগ ইনস্ট্যান্ট করার জন্য গিয়েছিলাম, যা একটি সুন্দর কাজ যা কোনও কারণে প্রতিশ্রুতিবদ্ধ হওয়ার কারণে (আসলে স্বতঃসংশোধন) আমার পক্ষে কাজ করে না, অনেকগুলি সমসাময়িক থ্রেডের কারণে কিছুটা প্রশ্ন জারি করার কারণে আমি কিছুটা গুরুতর আন্তঃবিয়োগ পেয়েছিলাম প্রতি সেকেন্ডে.
মিলান Velebit

সন্নিবেশ, নির্বাচন এবং যেখানে ব্যবহার করে নকল রেকর্ডগুলির সাথে কাজ করে না।
ই তথ্য 128

114

এছাড়াও, cursor.lastrowid(মাইএসকিউএলডিবি সমর্থিত একটি ডিবাপি / পিইপি 249 এক্সটেনশন):

>>> import MySQLdb
>>> connection = MySQLdb.connect(user='root')
>>> cursor = connection.cursor()
>>> cursor.execute('INSERT INTO sometable VALUES (...)')
1L
>>> connection.insert_id()
3L
>>> cursor.lastrowid
3L
>>> cursor.execute('SELECT last_insert_id()')
1L
>>> cursor.fetchone()
(3L,)
>>> cursor.execute('select @@identity')
1L
>>> cursor.fetchone()
(3L,)

cursor.lastrowidconnection.insert_id()মাইএসকিউএল-তে অন্য রাউন্ড ভ্রমণের চেয়ে কিছুটা কম এবং আরও সস্তা।


4
cursor.lastrowidতুলনায় সস্তা কেন connection.insert_id()?
মার্টিন থোমা

3
কেবলমাত্র কার্সার.আল্ট্রোয়েড কার্সার.অ্যাসেকিউট () এর অংশ হিসাবে স্বয়ংক্রিয়ভাবে কার্সার অবজেক্টে সেট হয়ে গেছে এবং এটি কেবল একটি বৈশিষ্ট্যযুক্ত অনুসন্ধান। সংযোগ.insert_id () একটি অতিরিক্ত অপ্রয়োজনীয় ফাংশন কল - এটি ইতিমধ্যে কল করা হয়েছে এবং যার ফলাফল লাস্ট্রয়েড বৈশিষ্ট্যে পাওয়া যায়।
অ্যান্ড্রু

5
আমার সবেমাত্র একটি সমস্যা হয়েছিল যেখানে এর cursor.lastrowidচেয়ে আলাদা কিছু ফিরে এসেছিল connection.insert_id()cursor.lastrowidশেষ সন্নিবেশ আইডি connection.insert_id()ফিরিয়েছে , ফিরে এসেছে 0। কিভাবে যে হতে পারে?
মার্টিন থোমা

1
@ মুজ, সম্ভবত সমবর্তী প্রক্রিয়াগুলি একই সংযোগ ব্যবহার করে সমান্তরাল ডাটাবেস সন্নিবেশ করছে।
xiaohan2012

1
@ ফ্লাইংআ্যাটম, কারণ এটি পাইথন 3 এর পরিবর্তে পাইথন 2 এ চালিত হয়েছিল।
অ্যান্ড্রু

35

পাইথন ডিবিএপিআই স্পেস কার্সার অবজেক্টের জন্য 'লাস্ট্রোইড' বৈশিষ্ট্যও সংজ্ঞায়িত করে, তাই ...

id = cursor.lastrowid

... খুব কাজ করা উচিত, এবং এটি স্পষ্টতই প্রতি সংযোগ ভিত্তিক।


7
SELECT @@IDENTITY AS 'Identity';

অথবা

SELECT last_insert_id();

2
এটি জাতির শর্তগুলির জন্য অনুমতি দেয় কারণ আপনি সার্ভার থেকে সর্বশেষ সারির আইডিটির অনুরোধ করছেন। কারণ আমি, আপনি এই জগাখিচুড়ি চান না।
জোশুয়া বার্নস


1
আমি এই অংশটি সমানভাবে গুরুত্বপূর্ণ হিসাবে উল্লেখ করতে চাই: "প্রতিটি ক্লায়েন্ট ক্লায়েন্টের মৃত্যুদন্ড কার্যকর করা শেষ বিবৃতিটির জন্য সর্বশেষ sertedোকানো আইডি পাবেন।" সুতরাং আপনি select last_insert_id()একটি লিনাক্স মেশিনে সিএলআই থেকে ঠিক একই চালানোর চেয়ে ওয়ার্কবেঞ্চের থেকে আলাদা মান পাবেন
42
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.