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()]
我有以下 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()]