SQLAlchemy:是否可以在同一查询中组合 "like" 和 "in"

SQLAlchemy: Is it possible to combine "like" and "in" within the same query

我有以下 SQLAlchemy 查询工作

incomplete_list = ['a','b','c']

complete_units = []
for elem in incomplete_list:
    query = Table.query.filter(Table.name.like(elem))
    for row in query:
        complete_units.append(row.unit_number)

我想避免使用for循环多次查询数据库。是否可以组合“in”和“like”运算符以便我只查询一次数据库?还是有更好的方法来执行此查询?谢谢

改编自:

incomplete_list = ['a','b','c']
complete_units = []

clauses = [Table.name.like(elem) for elem in incomplete_list]
query = Table.query.filter(or_(*clauses))
complete_units = query.all()

严格来说,此执行路径的结果可能与您的示例代码不同,因为如果 Table 包含满足 incomplete_list 的多个条件的行,您的示例代码将 return 同一行多次,而此代码只会执行一次(我认为这是需要的)。

使用 SQL Alchemy,在考虑 python 之前考虑 SQL 是很有用的。您正在尝试获取某一列与任一特定模式匹配的任何行的单位编号。

SELECT unit_number FROM Table WHERE name like any ("pattern1", "pattern2")

SQL炼金术就是这样-

q = select(Table.c.unit_number).where(Table.c.name.like(any_(incomplete_list)))
complete_unites = [row[0] for row in conn.execute(q)]

再详细一点...

您编写代码的方式 Table.query.filter(Table.name.like(elem)) 您正在为每个循环执行单独的 SQL 查询。虽然这可能没问题,但这意味着每个人都是独立的,如果您选择这样做,您将无法执行诸如使用数据库订购之类的事情。

此外,您分享的语法可能是 flask-sqlalchemy。我使用的语法是 1.4 版本,但可以很容易地进行调整。 Flask-sqlalchemy 使用的是 ORM 模型,它在每个 class 上添加了一个特殊的 属性 基本上是

class Model:
  @property
  def query(self):
    return Session.Query(Model)

问题是,没有简单的方法来 select 特定的行或列,但这几乎不是世界末日(你只是 return 比你需要的数据多,这是否重要由你决定)

q = Table.query.filter(Table.name.like(any_(incomplete_list)))
complete_units = [row.unit_number for row in q.all()]