假设我有一个这样的模型:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) hometown = db.Column(db.String(140)) university = db.Column(db.String(140))
为了从纽约获得用户列表,这是我的查询:
User.query.filter_by(hometown='New York').all()
为了获得去USC的用户列表,这是我的查询:
User.query.filter_by(university='USC').all()
为了获得纽约的用户列表以及去过南加州大学的用户,这是我的查询:
User.query.filter_by(hometown='New York').filter_by(university='USC').all()
现在,我想基于变量的值动态生成这些查询。
例如,我的变量可能如下所示:
{'hometown': 'New York'}
或像这样:
{'university': 'USC'}
…甚至像这样:
[{'hometown': 'New York'}, {'university': 'USC'}]
您能帮我编写一个将字典(或词典列表)作为输入,然后动态构建正确的sqlalchemy查询的函数吗?
如果我尝试为关键字使用变量,则会出现以下错误:
key = 'university' User.query.filter_by(key='USC').all() InvalidRequestError: Entity '<class 'User'>' has no property 'key'
其次,我不确定如何将多个filter_by表达式动态链接在一起。
我可以显式地调用filter_by表达式,但是如何基于变量将多个链接在一起?
希望这更有意义。
SQLAlchemy的filter_by采用关键字参数:
filter_by
filter_by(** kwargs)
换句话说,该函数将允许你为它提供任何关键字参数。这就是为什么可以在代码中使用任何关键字的原因:SQLAlchemy基本上将参数视为值的字典。有关关键字参数的更多信息,请参见Python教程。
这样,SQLAlchemy的开发人员就可以以字典形式接收任意一堆关键字参数。但是,你要求的却相反:你可以将任意一堆关键字参数传递给函数吗?
事实证明,在Python中,你可以使用称为unpacking的功能。只需创建参数字典并将其传递给以开头的函数**,如下所示:
kwargs = {'hometown': 'New York', 'university' : 'USC'} User.query.filter_by(**kwargs) # This above line is equivalent to saying... User.query.filter_by(hometown='New York', university='USC')