দফায় এসকিউএলএলকেমি


237

আমি স্কেলচেমিতে এই কোয়েরিটি করার চেষ্টা করছি

SELECT id, name FROM user WHERE id IN (123, 456)

[123, 456]মৃত্যুদন্ড কার্যকর করার সময় আমি তালিকাটি বাঁধতে চাই ।

উত্তর:


331

কেমন

session.query(MyUserClass).filter(MyUserClass.id.in_((123,456))).all()

সম্পাদনা : ওআরএম ছাড়া এটি হবে be

session.execute(
    select(
        [MyUserTable.c.id, MyUserTable.c.name], 
        MyUserTable.c.id.in_((123, 456))
    )
).fetchall()

select()দুটি পরামিতি লাগে, প্রথমটি পুনরুদ্ধার করতে ক্ষেত্রগুলির একটি তালিকা, দ্বিতীয়টি whereশর্ত। আপনি c(বা columns) বৈশিষ্ট্যের মাধ্যমে কোনও টেবিল অবজেক্টের সমস্ত ক্ষেত্র অ্যাক্সেস করতে পারেন ।


6
আমি বর্তমানে স্ক্ল্যাচেমির ORM অংশটি ব্যবহার করছি না, তবে কেবল এসকিউএল এক্সপ্রেশন API।
— winzbak

136

ধরে নেওয়া যায় যে আপনি ঘোষণামূলক স্টাইলটি (অর্থাত্ ওআরএম ক্লাস) ব্যবহার করেন এটি বেশ সহজ:

query = db_session.query(User.id, User.name).filter(User.id.in_([123,456]))
results = query.all()

db_sessionযখন আপনার ডাটাবেস অধিবেশন, এখানে Userসঙ্গে ORM ক্লাস হয় __tablename__সমান "users"।


29
~( ~User.id.in_([123,456])) অথবা not_থেকে sqlalchemy.sql.expression( not_(User.id.in_([123,456]))) ব্যবহার করুন ।
— Xion


38

বিকল্প উপায়টি এসকিউএলএলচেমির সাথে কাঁচা এসকিউএল মোড ব্যবহার করা হচ্ছে, আমি সংযোগকারী হিসাবে এসকিউএলএলকেমি 0.9.8, পাইথন 2.7, মাইএসকিউএল 5. এক্স এবং মাইএসকিউএল-পাইথন ব্যবহার করি, এই ক্ষেত্রে একটি টুপল প্রয়োজন needed আমার কোড নীচে তালিকাভুক্ত:

id_list = [1, 2, 3, 4, 5] # in most case we have an integer list or set
s = text('SELECT id, content FROM myTable WHERE id IN :id_list')
conn = engine.connect() # get a mysql connection
rs = conn.execute(s, id_list=tuple(id_list)).fetchall()

আশা করি সবকিছু আপনার জন্য কাজ করে।


5
আপনি যদি এই জাতীয় সাধারণ প্রশ্নের জন্য কাঁচা এসকিউএল ব্যবহার করেন তবে আপনি সরাসরি সাইকোপজি 2 বা অন্য সংযোগকারীটি ব্যবহার করা ভাল।
— ওমিক্রন

6

এক্সপ্রেশন এপিআই সহ, যা মন্তব্যের ভিত্তিতে এই প্রশ্নটি জিজ্ঞাসা করছে, আপনি in_প্রাসঙ্গিক কলামের পদ্ধতিটি ব্যবহার করতে পারেন ।

অনুসন্ধানের জন্য

SELECT id, name FROM user WHERE id in (123,456)

ব্যবহার

myList = [123, 456]
select = sqlalchemy.sql.select([user_table.c.id, user_table.c.name], user_table.c.id.in_(myList))
result = conn.execute(select)
for row in result:
    process(row)

এটি ধরে নিয়েছে user_tableএবং connযথাযথভাবে সংজ্ঞায়িত করা হয়েছে।


1

অজগর 3 এ স্ক্ল্যালেচেমি এবং পান্ডাস ব্যবহার করে আমার সমাধানটি ভাগ করে নিতে চেয়েছি, সম্ভবত, কেউ এটির কাজে লাগবে।

import sqlalchemy as sa
import pandas as pd
engine = sa.create_engine("postgresql://postgres:my_password@my_host:my_port/my_db")
values = [val1,val2,val3]   
query = sa.text(""" 
                SELECT *
                FROM my_table
                WHERE col1 IN :values; 
""")
query = query.bindparams(values=tuple(values))
df = pd.read_sql(query, engine)

-2

উপরের উত্তরগুলিতে কেবল একটি সংযোজন।

যদি আপনি "IN" বিবৃতি সহ কোনও এসকিউএল সম্পাদন করতে চান তবে আপনি এটি করতে পারেন:

ids_list = [1,2,3]
query = "SELECT id, name FROM user WHERE id IN %s" 
args = [(ids_list,)] # Don't forget the "comma", to force the tuple
conn.execute(query, args)

দুটি বিন্দু:

  • আইএন স্টেটমেন্ট (যেমন "... IN (% s)") এর জন্য প্যারেন্টেসিসের দরকার নেই, কেবল "... IN% s" লিখুন
  • আপনার আইডির তালিকাটিকে একটি টিউপলের একটি উপাদান হতে বাধ্য করুন। ",": (Ids_list,) ভুলবেন না

সম্পাদনা দেখুন দেখুন তালিকার দৈর্ঘ্য যদি এক বা শূন্য হয় তবে এটি ত্রুটি বাড়িয়ে তুলবে!


2
আমার মনে হয় আপনার করা উচিত args = [(tuple(ids_list),)], দয়া করে ডাবল চেক করুন।
— zs2020

4
ওপি জিজ্ঞাসা করছে কীভাবে স্ক্লাচমিতে এটি করা যায়, কাঁচা ডিবাপি কলটি ব্যবহার না করে ...
— কাওবার্ট

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