当前位置: 首页 > 面试题库 >

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

扈瑞
2023-03-14
问题内容

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

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(** 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')


 类似资料:
  • 问题内容: 在VB.NET中,我们可以将变量名称括在方括号中,并使用关键字作为变量名称,如下所示: 相当于C#: 我想知道是否有Java相当于这样做? 问题答案: 不可以。您可以添加下划线或类似的废话,但是基本上关键字是不可行的。

  • 问题内容: 如果声明变量而不使用“ var”,则变量始终变为GLOBAL。 在函数内部声明全局变量是否有用?我可以想象在某个事件处理程序中声明一些全局变量,但这有什么用呢?更好地使用RAM? 问题答案: 不,没有RAM好处或类似的好处。 w3schools谈论的是我所说的“内隐全球性恐怖” 。考虑以下功能: 看起来很简单,但是由于线路上的错字,它返回,而不是。并创建一个带有输入错误名称的全局变量:

  • 问题内容: 我有以下带有变量的类,和。是一个关键字。如果要在下面的init方法中使用它,编写它的正确方法是什么? 更多上下文:该类明确需要该变量,因为它是另一个开发人员用另一种语言编写的POST端点所需的json的一部分。因此,更改变量名称是不可能的。 JsonAware代码: GenericEncoder代码: 问题答案: 如注释中所述,它是一个Python关键字,因此您不能将其用作变量名或属性

  • 问题内容: 解决以下问题 的最有效方法 是什么?从交互式外壳程序: 目前,我正在解决以下问题: 但是看起来很笨拙… (python 2.7+或3.2+解决方案都可以) 问题答案: 使用关键字参数解包:

  • 问题内容: 关键字如何使变量不可变?维基百科说没有。 问题答案: 在Java中,术语 final 是指引用,而不 可变 是指对象。将修饰符分配给引用意味着它不能更改为指向另一个对象,但是如果对象是可变的,则可以对其进行修改。 例如: 就像Wikipedia文章中提到的那样,如果您来自C ++,则必须分离出into 和不可变的概念。

  • 问题内容: 在Python(2.7)中,有没有更简单的方法可以做到这一点?:注意:这并不是什么花哨的事情,就像将所有局部变量放入字典一样。只是我在列表中指定的那些。 问题答案: