在条款中的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_tableconn已被适当地定义。

只是除了上面的答案。

如果你想用“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,)

编辑注意,如果列表的长度是一个或零,这将引发一个错误!