আমার একটি অজগর তালিকা আছে, বলুন
l = [1,5,8]
আমি তালিকার সমস্ত উপাদানগুলির ডেটা পেতে একটি বর্গ কোয়েরি লিখতে চাই, বলুন
select name from students where id = |IN THE LIST l|
আমি কীভাবে এটি সম্পাদন করব?
আমার একটি অজগর তালিকা আছে, বলুন
l = [1,5,8]
আমি তালিকার সমস্ত উপাদানগুলির ডেটা পেতে একটি বর্গ কোয়েরি লিখতে চাই, বলুন
select name from students where id = |IN THE LIST l|
আমি কীভাবে এটি সম্পাদন করব?
উত্তর:
উত্তরগুলি এখনও অবধি মানকে একটি সরল এসকিউএল স্ট্রিংয়ে টেম্প্লেট করছে। এটি পূর্ণসংখ্যার জন্য একেবারে ঠিক আছে, তবে আমরা যদি স্ট্রিংয়ের জন্য এটি করতে চাই তবে আমরা পালানোর সমস্যাটি পাই।
এখানে প্যারামিটারাইজড ক্যোয়ারী ব্যবহার করে একটি বৈকল্পিক যা উভয়ের জন্যই কার্যকর হবে:
placeholder= '?' # For SQLite. See DBAPI paramstyle.
placeholders= ', '.join(placeholder for unused in l)
query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders
cursor.execute(query, l)
([placeholder]*len(l))সাধারণ ক্ষেত্রে হতে হবে কারণ স্থানধারক একাধিক অক্ষর থাকতে পারে।
cursor.execute(f'SELECT name FROM students WHERE id IN ({','.join('?' for _ in l)})', l)। @ বিবিস, আপনার সমাধানে আপনার মন্তব্য করা উচিত যে ?এসকিউএল ইঞ্জেকশন এড়ানোর ক্ষেত্রে ব্যবহার করা নিরাপদ উপায়। এখানে প্রচুর উত্তর রয়েছে যা অরক্ষিত, মূলত যে কোনও অজগরটিতে স্ট্রিংগুলি যুক্ত করে।
সবচেয়ে সহজ উপায় হ'ল tupleপ্রথমে তালিকাটি চালু করা
t = tuple(l)
query = "select name from studens where id IN {}".format(t)
এটিকে জটিল করবেন না, এর সমাধান খুব সহজ is
l = [1,5,8]
l = tuple(l)
params = {'l': l}
cursor.execute('SELECT * FROM table where id in %(l)s',params)
আমি আশা করি এটি সাহায্য করেছে !!!
lকেবল একটি উপাদান থাকে তবে এটি কাজ করে না , আপনি শেষ করবেন id IN (1,)। যা একটি সিনট্যাক্স ত্রুটি।
sqlite3। আপনি কোন লাইব্রেরির বিরুদ্ধে এটি পরীক্ষা করেছেন?
আপনি যে এসকিউএল চান তা হ'ল
select name from studens where id in (1, 5, 8)
আপনি যদি পাইথন থেকে এটি নির্মাণ করতে চান তবে আপনি ব্যবহার করতে পারেন
l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')'
মানচিত্র ফাংশন স্ট্রিং একটি তালিকা যে ব্যবহার কমা দ্বারা একসঙ্গে glued করা যাবে মধ্যে তালিকা রূপান্তরিত হবে str.join পদ্ধতি।
বিকল্পভাবে:
l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')'
আপনি যদি জেনারেটর এক্সপ্রেশন পছন্দ করেন মানচিত্রের কার্যক্রমে ।
আপডেট: এস লট মন্তব্যগুলিতে উল্লেখ করেছেন যে পাইথন এসকিউএলাইট বাইন্ডিংগুলি ক্রমগুলি সমর্থন করে না। সেক্ষেত্রে আপনি চাইবেন
select name from studens where id = 1 or id = 5 or id = 8
দ্বারা উত্পন্ন
sql_query = 'select name from studens where ' + ' or '.join(('id = ' + str(n) for n in l))
স্ট্রিং.কোমাস দ্বারা বিভক্ত তালিকার মানগুলিতে যোগদান করুন এবং একটি ক্যোরি স্ট্রিং তৈরি করতে ফর্ম্যাট অপারেটরটি ব্যবহার করুন ।
myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))
(ধন্যবাদ, ব্লেয়ার-কনরাড )
%ব্যবহৃত হচ্ছে কেবল সরল পাইথন স্ট্রিং ফর্ম্যাটিং।
আমি বোবিন্সের উত্তরটি পছন্দ করি:
placeholder= '?' # For SQLite. See DBAPI paramstyle.
placeholders= ', '.join(placeholder for unused in l)
query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders
cursor.execute(query, l)
তবে আমি এটি লক্ষ্য করেছি:
placeholders= ', '.join(placeholder for unused in l)
এর সাথে প্রতিস্থাপন করা যেতে পারে:
placeholders= ', '.join(placeholder*len(l))
আমি কম চালাক এবং কম সাধারণ হলে এটি আরও সরাসরি খুঁজে পাই। এখানে lএকটি দৈর্ঘ্য থাকা প্রয়োজন (অর্থাত্ কোনও __len__পদ্ধতিটিকে সংজ্ঞায়িত করে এমন কোনও বস্তুর উল্লেখ করুন ), যা কোনও সমস্যা হওয়া উচিত নয়। তবে স্থানধারক অবশ্যই একটি একক চরিত্র হতে হবে। একটি বহু-চরিত্রের স্থানধারক ব্যবহারকে সমর্থন করতে:
placeholders= ', '.join([placeholder]*len(l))
@ পরিমাণযুক্ত উত্তরের জন্য সমাধান, কারণ এটি এক-মৌলিক মূল্যের সাথে ভেঙে গেছে, যেহেতু (1,) বৈধ এসকিউএল নয়:
>>> random_ids = [1234,123,54,56,57,58,78,91]
>>> cursor.execute("create table test (id)")
>>> for item in random_ids:
cursor.execute("insert into test values (%d)" % item)
>>> sublist = [56,57,58]
>>> cursor.execute("select id from test where id in %s" % str(tuple(sublist)).replace(',)',')'))
>>> a = cursor.fetchall()
>>> a
[(56,), (57,), (58,)]
স্কয়ার স্ট্রিংয়ের অন্যান্য সমাধান:
cursor.execute("select id from test where id in (%s)" % ('"'+'", "'.join(l)+'"'))
আপনি যদি সাইকোপজি 2 লাইব্রেরির সাথে পোস্টগ্রিজ এসকিউএল ব্যবহার করে থাকেন তবে আপনি এর টিপল অ্যাডাপশনটি আপনার জন্য সমস্ত প্রস্থান এবং স্ট্রিং ইন্টারপোলেশন করতে দিতে পারেন, যেমন:
ids = [1,2,3]
cur.execute(
"SELECT * FROM foo WHERE id IN %s",
[tuple(ids)])
অর্থাত্ নিশ্চিত করে নিন যে আপনি INপ্যারামিটারটি পাস করছেন tuple। যদি এটি হয় তবে listআপনি = ANYঅ্যারে সিনট্যাক্সটি ব্যবহার করতে পারেন :
cur.execute(
"SELECT * FROM foo WHERE id = ANY (%s)",
[list(ids)])
মনে রাখবেন যে এই দুটিই একই ক্যোয়ারী পরিকল্পনায় রূপান্তরিত হবে তাই আপনার মধ্যে যে কোনওটি সহজ use উদাহরণস্বরূপ, যদি আপনার তালিকাটি একটি টিপলে আসে তবে প্রাক্তনটিকে ব্যবহার করুন, যদি তারা একটি তালিকায় সঞ্চিত থাকে তবে পরবর্তীটি ব্যবহার করুন।
l = [1] # or [1,2,3]
query = "SELECT * FROM table WHERE id IN :l"
params = {'l' : tuple(l)}
cursor.execute(query, params)
:varস্বরলিপি সহজ বলে মনে হয়। (পাইথন ৩.7)
এটি প্যারামিটার বিকল্প ব্যবহার করে এবং একক মান তালিকার কেস যত্ন করে:
l = [1,5,8]
get_operator = lambda x: '=' if len(x) == 1 else 'IN'
get_value = lambda x: int(x[0]) if len(x) == 1 else x
query = 'SELECT * FROM table where id ' + get_operator(l) + ' %s'
cursor.execute(query, (get_value(l),))
','.join(placeholder * len(l))