2011-12-22 72 views
133

我試圖做到這一點查詢在SQLAlchemy的SQLAlchemy的條款

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

我想綁定列表[123456]的執行時間。

回答

166

如何

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)屬性訪問表格對象上的所有字段。

+4

我目前沒有使用sqlachemy的ORM部分,但只使用SQL Expression API。 – wonzbak

94

假設你使用的聲明樣式(即ORM類),這是很簡單的:

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

db_session在這裏你的數據庫會話,而User是ORM類__tablename__等於"users"

+1

in子句工作正常,如何使用notin_(NOT IN)子句 – sunny

+16

從'sqlalchemy.sql.expression'使用'〜'('〜User.id.in _([123,456])')或'not_'(' not_(User.id.in _([123456]))')。 – Xion

+1

非常感謝@Xion – sunny

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)」),只需放入「... IN%s」
  • 強制您的ID列表爲元組的一個元素。不要忘了「」(ids_list)

編輯 當心,如果列表的長度爲一或零,這將引發一個錯誤!

+2

我認爲你應該做'args = [(tuple(ids_list),]]',請仔細檢查。 – zsong

+1

OP問如何在sqlalchemy中執行此操作,而不是使用原始dbapi調用... – cowbert

4

使用基於註釋的表達式API是此問題要求的表達式API,可以使用相關列的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_tableconn已適當定義。

13

另一種方法是在SQLAlchemy中使用原始SQL模式,我使用SQLAlchemy 0.9.8,python 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() 

希望一切都適合你。

+3

如果您使用原始SQL進行此類簡單查詢,則最好直接使用psycopg2或其他連接器。 – omikron