从SQL Alchemy ORM Query获取过滤值

时间:2017-11-24 19:04:59

标签: python sqlalchemy

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

我到目前为止:

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

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

1 个答案:

答案 0 :(得分: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()}