【问题标题】:Get filtered values from SQL Alchemy ORM Query从 SQL Alchemy ORM 查询中获取过滤值
【发布时间】:2018-05-08 19:07:57
【问题描述】:

我有一个Query 对象,我已经对其进行了一些过滤。现在我传递了那个查询,然后我想看看我过滤了什么,使用某种检查。

我已经做到了:

>>> q = session.query(Activity).filter(Activity.label == "Foo")
>>> print(q.whereclause)
table.activity.label = :label_1

除了列名(不是我想要的过滤值,在本例中为“Foo”)之外,我找不到从 sqlalchemy.sql.elements.BinaryExpression 中获取任何其他内容的方法。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您可以使用_criterion 属性获取更多详细信息。 例子:

    In [1]: first = User.query.filter(User.confirmed_at.isnot(None))
    
    In [2]: vars(first._criterion)
    Out[2]: 
    {'_orig': (Column('confirmed_at', DateTime(), table=<users>),
      <sqlalchemy.sql.elements.Null object at 0x7f7a667e25c0>),
     'left': Column('confirmed_at', DateTime(), table=<users>),
     'modifiers': {},
     'negate': <function sqlalchemy.sql.operators.is_>,
     'operator': <function sqlalchemy.sql.operators.isnot>,
     'right': <sqlalchemy.sql.elements.Null object at 0x7f7a667e25c0>,
     'type': NullType()}
    
    In [3]: second = User.query.filter(User.login_count > 5)
    
    In [4]: vars(second._criterion)
    Out[4]: 
    {'_orig': (Column('login_count', Integer(), table=<users>, nullable=False, server_default=DefaultClause('0', for_update=False)),
      BindParameter('%(140163529198168 login_count)s', 5, type_=Integer())),
     'left': Column('login_count', Integer(), table=<users>, nullable=False, server_default=DefaultClause('0', for_update=False)),
     'modifiers': {},
     'negate': <function _operator.le>,
     'operator': <function _operator.gt>,
     'right': BindParameter('%(140163529198168 login_count)s', 5, type_=Integer()),
     'type': Boolean()}
    

    【讨论】:

    • 啊,漂亮。我不知道vars.whereclause 只是 ._criterion 的别名。所以,在这种情况下,我可以使用q.whereclause.right.effective_value。这给了我我所追求的“Foo”。谢谢你告诉我vars :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多