खंड में SQLAlchemy


237

मैं इस क्वेरी को sqlalchemy में करने की कोशिश कर रहा हूं

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

मैं [123, 456]निष्पादन समय पर सूची को बांधना चाहूंगा ।

जवाबों:


332

कैसा रहेगा

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

संपादित करें : ORM के बिना, यह होगा

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

select()दो मापदंडों को लेता है, पहले एक को पुनः प्राप्त करने के लिए खेतों की एक सूची है, दूसरी whereस्थिति है। आप c(या columns) संपत्ति के माध्यम से एक टेबल ऑब्जेक्ट पर सभी क्षेत्रों तक पहुंच सकते हैं।


6
मैं वर्तमान में sqlachemy के ORM भाग का उपयोग नहीं कर रहा हूं, लेकिन केवल SQL अभिव्यक्ति API।
wonzbak

136

यदि आप घोषणात्मक शैली (यानी ORM वर्ग) का उपयोग करते हैं, तो यह बहुत आसान है:

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

db_sessionयहाँ आपका डेटाबेस सत्र है, जबकि UserORM वर्ग के __tablename__बराबर है "users"


29
उपयोग ~( ~User.id.in_([123,456])) या not_से sqlalchemy.sql.expression( not_(User.id.in_([123,456])))।
Xion


38

एक वैकल्पिक तरीका SQLAlchemy के साथ कच्चे SQL मोड का उपयोग कर रहा है, मैं SQLAlchemy 0.9.8, अजगर 2.7, MySQL 5.X और कनेक्टर के रूप में MySQL-Python का उपयोग करता हूं, इस मामले में, एक टपल की जरूरत है। मेरा कोड नीचे सूचीबद्ध है:

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
यदि आप ऐसे सरल प्रश्नों के लिए कच्चे SQL का उपयोग करते हैं तो आप सीधे psycopg2 या अन्य कनेक्टर का उपयोग करना बेहतर समझते हैं।
ओमिक्रॉन

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

बस अपने समाधान का उपयोग करना चाहता था python 3 में sqlalchemy और पांडा का उपयोग करके 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

उपरोक्त उत्तरों के लिए बस एक अतिरिक्त।

यदि आप एक SQL को "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 स्टेटमेंट (जैसे "... IN (% s)") के लिए पेरेंटेसिस की कोई आवश्यकता नहीं है, बस "...% s" डाल दें
  • अपनी आइडी की सूची को टपल का एक तत्व होने के लिए मजबूर करें। मत भूलना ",": (ids_list)

EDIT यह देखें कि यदि सूची की लंबाई एक या शून्य है तो यह त्रुटि उत्पन्न करेगा!


2
मुझे लगता है कि आपको करना चाहिए args = [(tuple(ids_list),)], कृपया दोहरी जांच करें।
zs2020

4
ओपी पूछ रहा है कि यह कैसे स्क्वेल्चेमी में किया जाए, कच्ची डबपी कॉल का उपयोग नहीं करना ...
काउबरी

यह एकल आइटम सूची के साथ काम नहीं करता है क्योंकि यह उत्पादन करता है (item, )और यह SQL में गलत है
डेनियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.