পাইথন / পোস্টগ্র্রেস / সাইকোপজি 2: সারিটির আইডি সন্নিবেশ করানো হয়েছে


105

পোস্টগ্র্যাসের ইন্টারফেসের জন্য আমি পাইথন এবং সাইকোপজি 2 ব্যবহার করছি।

আমি যখন একটি সারি sertোকি ...

sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)

... আমি সারিটি theোকানো সারিটির আইডি কীভাবে পাব? চেষ্টা করা হচ্ছে:

hundred = cursor.fetchall() 

ব্যবহার করার সময় একটি ত্রুটি প্রদান করে RETURNING id:

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ") RETURNING id;"
hundred = cursor.execute(sql_string)

সহজভাবে ফিরে আসে None

আপডেট: তাই currval(এমনকি এই কমান্ডটি পোস্টগ্র্যাগের কাজগুলিতে সরাসরি ব্যবহার করা হলেও):

sql_string = "SELECT currval(pg_get_serial_sequence('hundred', 'id'));"
hundred_id = cursor.execute(sql_string)

কেউ পরামর্শ দিতে পারেন?

ধন্যবাদ!

উত্তর:


214
cursor.execute("INSERT INTO .... RETURNING id")
id_of_new_row = cursor.fetchone()[0]

এবং দয়া করে ম্যানুয়ালি মানগুলি সহ এসকিউএল স্ট্রিংগুলি তৈরি করবেন না। আপনি পালিয়ে যাওয়া অপ্রয়োজনীয় এবং এসকিউএল ইঞ্জেকশনটিকে অসম্ভব করে তোলে বলে আলাদাভাবে মানগুলি (এবং হওয়া উচিত!) পাস করতে পারেন:

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES (%s,%s,%s) RETURNING id;"
cursor.execute(sql_string, (hundred_name, hundred_slug, status))
hundred = cursor.fetchone()[0]

আরো বিস্তারিত জানার জন্য psycopg ডক্স দেখুন: http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries


13
শুধু নির্মল, idমধ্যে RETURNING idসিরিয়াল / প্রাথমিক কী ক্ষেত্র ক্ষেত্র নাম হওয়া উচিত।
জোশডেন

11
কার্সার ফেচোন আমাকে "আনতে কোনও ফলাফল দেয় না"।
লিওনিড

@ লিওনিড আপনি কি এটি বুঝতে পেরেছেন?
অ্যালিসন এস

6
@ অ্যালিসনস @ লিওনিডে আমারও একই ত্রুটি ছিল, তবে ক্যোয়ারির RETURNING idশেষে যুক্ত করা INSERTআমার জন্য এটি ঠিক করে দিয়েছে।
বাঞ্জার

হয়তো শুধু একটু নোট, কিন্তু গুরুত্বপূর্ণ পয়েন্ট সবার জন্য উল্লেখ: নিশ্চিত আপনি শুধুমাত্র কার্সার ব্যবহার করছেন .execute () এবং না একটি কার্সার .mogrify () সামনে চালানো () , অন্যথায় cursor.fetchone (আমার ক্ষেত্রে হিসাবে) কমান্ড () কোন ফল হবে না! এই কমান্ডের আগে "কিছুই" ছাড়াই কেবল কার্সার। এক্সেকিউট () ব্যবহার করে আপনি একটি আইডি পাবেন।
TheHeroOfTime

14

আমি এখানেই শেষ করেছি কারণ আমারও একই সমস্যা ছিল, তবে আমরা পোস্টগ্রাস-এক্সসি ব্যবহার করছি, যা এখনও রিটার্নিং আইডি ধারাটি সমর্থন করে না। সেক্ষেত্রে আপনি ব্যবহার করতে পারেন:

কার্সার। এক্সেকুট ('অন্তর্ভুক্ত করুন ........')
কার্সার। এক্সেকিউট ('শেষ নির্বাচন ()')
লাস্টিড = কার্সার.ফেটচোন () ['শেষ অবধি']

কারও ক্ষেত্রে এটি কার্যকর ছিল!


4
শুধু মনে রাখবেন - এটি দুটি বিবৃতিতে করা যেমন জাতি অবস্থার ঝুঁকিপূর্ণ (খুব ছোট) চালায় যদি কোনও কিছু সরাসরি আপনার পরে ডাটাবেসে সারি প্রবেশ করায় তবে আপনার শেষের () কমান্ডটি ক্রমের বর্তমান মান ফেরত দেওয়ার আগে।
ডেভ থমাস

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