【问题标题】:Persistent where clause SQLAlchemy持久 where 子句 SQLAlchemy
【发布时间】:2011-03-25 23:57:46
【问题描述】:

我正在尝试在 SQLalchimy 中添加一个持久的 SQL where 子句。 基本上我有一个包含特定字段的表,我希望我的所有请求都添加一个 where 子句,所以这个字段匹配一个子句。

例如,如果我的请求是

session.query( MyTable ).all()

我希望生成的请求是这样的:

SELECT * FROM Table WHERE specific_field = 'some_value';

有没有一种方法可以在不为每个请求添加过滤器的情况下做到这一点?

提前致谢。

【问题讨论】:

标签: python mysql sqlalchemy


【解决方案1】:

如果你添加:

dbengine.echo = True
session.query(MyTable).filter_by(specified_field = 'some_value').all()

我不确定您的意思是什么:“没有为每个请求添加过滤器。”我的猜测是您不想在客户端过滤请求。为此生成的 SQL 应该看起来很像您所要求的; dbengine.echo = True 位将显示生成的 SQL。

根据 OP 评论更新:

如果您真的希望所有查询都有一个过滤器,那么一个简单(但在我看来不是那么漂亮)的方法是添加您自己的查询方法:

def myquery(self, table):
  self.query(table).filter_by(specified_field = 'some_value')

session.__class__.some_arbitrarily_filtered_query = myquery

之后,您可以调用(例如):

session.some_arbitrarily_filtered_query(MyTable).all()

【讨论】:

  • 是的,但目的是让 filter_by(specified_field = 'some_value') 自动添加
  • 我想我会手动使用过滤器,但感谢您的想法!
  • @chouquette:这听起来是个正确的决定。如果您经常使用某些类型的查询,您可以稍后将它们放在一个函数中——我认为这是使用 SQLAlchemy 的查询构造方法的主要好处之一。
【解决方案2】:

不是真的建议这样做,因为它过于复杂,但是...

CREATE VIEW Table2 AS SELECT * FROM Table WHERE specific_field = 'some_value';

然后你用

反映视图
table2 = sqlalchemy.Table('Table2', metadata, autoload=True)

然后在那里查询,可能将它(也提供主键)映射到

class MyTable2(MyTable):
    pass

未经测试,但应该可以工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2020-11-18
    • 2021-04-20
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多