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


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.