使用关键字作为变量的flask sqlalchemy查询

Sea*_*lus 14 python sql sqlalchemy flask flask-sqlalchemy

假设我有一个这样的模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    hometown = db.Column(db.String(140))
    university = db.Column(db.String(140))
Run Code Online (Sandbox Code Playgroud)

要获取纽约的用户列表,这是我的查询:

User.query.filter_by(hometown='New York').all()
Run Code Online (Sandbox Code Playgroud)

要获取前往USC的用户列表,这是我的查询:

User.query.filter_by(university='USC').all()
Run Code Online (Sandbox Code Playgroud)

要获得纽约的用户列表,以及谁去USC,这是我的查询:

User.query.filter_by(hometown='New York').filter_by(university='USC').all()
Run Code Online (Sandbox Code Playgroud)

现在,我想根据变量的值动态生成这些查询.

例如,我的变量可能如下所示:

    {'hometown': 'New York'}
Run Code Online (Sandbox Code Playgroud)

或者像这样:

    {'university': 'USC'}
Run Code Online (Sandbox Code Playgroud)

......或者甚至是这样的:

    [{'hometown': 'New York'}, {'university': 'USC'}]
Run Code Online (Sandbox Code Playgroud)

你可以帮我编写一个以字典(或字典列表)作为输入的函数,然后动态构建正确的sqlalchemy查询吗?

如果我尝试为关键字使用变量,我得到这个错误:

key = 'university'
User.query.filter_by(key='USC').all()

InvalidRequestError: Entity '<class 'User'>' has no property 'key'
Run Code Online (Sandbox Code Playgroud)

其次,我不确定如何动态地将多个filter_by表达式链接在一起.

我可以明确地调出一个filter_by表达式,但是如何根据变量将几个链接在一起呢?

希望这更有意义.

谢谢!

Mar*_*eth 41

SQLAlchemy使用filter_by关键字参数:

filter_by(**kwargs)

换句话说,该函数将允许您为其提供任何关键字参数.这就是为什么你可以在代码中使用你想要的任何关键字的原因:SQLAlchemy基本上将参数视为值的字典.有关关键字参数的更多信息,请参阅Python教程.

因此,SQLAlchemy的开发人员可以以字典形式接收任意一组关键字参数.但是你要求相反的结果:你能否一串任意关键字参数传递给函数?

事实证明,在Python中,您可以使用称为解包的功能.只需创建参数字典并将其传递给前面的函数**,如下所示:

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')
Run Code Online (Sandbox Code Playgroud)

  • 你是如何通过这样做实现"in_"的? (2认同)