在条款中的sqlalchemy
我正在尝试在sqlalchemy中执行此查询
SELECT id, name FROM user WHERE id in (123,456)
我想在执行时绑定列表[123,456]。
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
)属性访问表对象上的所有字段。
假设你使用声明式的风格(即ORM类),这很简单:
query = db_session.query(User.id, User.name).filter(User.id.in_([123,456])) results = query.all()
db_session
是你的数据库会话,而User
是ORM类, __tablename__
等于"users"
。
另一种方法是在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()
希望一切都适合你。
使用基于注释的expression式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_table
和conn
已被适当地定义。
只是除了上面的答案。
如果你想用“IN”语句执行SQL,你可以这样做:
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,)
编辑注意,如果列表的长度是一个或零,这将引发一个错误!