【问题标题】:Flask-AppBuilder equivalent of SQLite WHERE clause to filter column dataFlask-AppBuilder 等效于 SQLite WHERE 子句来过滤列数据
【发布时间】:2019-02-09 23:54:04
【问题描述】:

我是 Flask 的新手,已经开始使用 Flask-AppBuilder 为库存管理数据库设计前端。

我已经创建了几个模型,并设法使用Flask-AppBuilderviews 在表格中显示我的sqlite 数据。

但是,我似乎无法找到相当于 SQLite WHERE 子句来过滤或“限制”列数据。我一直在阅读很多关于sqlalchemy、过滤器、查询的信息,但这让我更加困惑,其他任何事情和解释似乎都非常复杂,做一些非常简单的事情。

假设我们在 Flask-AppBuilder 中重现以下 SQLite 查询:

SELECT Field_A
FROM Table_A
WHERE Field_A = 'some text'

与:

result = session.query(Table_A).filter_by(Field_A = 'some text').all()

上述代码行在我的应用程序中的什么位置?

考虑到我有以下Class

class Table_A(Model):
    id = Column(Integer, primary_key=True)
    Field_A =  Column(String)

    def __repr__(self):
        return self

View:

class Table_AView(ModelView):
    datamodel = SQLAInterface(Table_AView)
    label_columns = {'Field_A':'A'}
    list_columns = ['Field_A']

【问题讨论】:

    标签: python-3.x flask flask-sqlalchemy flask-appbuilder


    【解决方案1】:

    经过大量挖掘flask-appbuilder 使用它自己的 filterclass 来过滤视图。

    所有类都在 GitHub 上引用: Flask Filter Clases List

    FilterEqualFilterEqualFunction 之间也没有区别: What is the difference between : FilterEqual and FilterEqualFunction?

    对于 Flask-appbuilder 的其他自定义和第一个调用端口,请直接访问 API Reference,您可以在其中找到几个实际使用的 filterclass 示例。

    本质上它非常简单。在您想要过滤的ModelView 类中的views.py 代码中,只需添加base_filters = [['field_A', FilterEqual, 'abc']],如下所示:

    `class Table_AView(ModelView):
        datamodel = SQLAInterface(Table_AView)
        label_columns = {'Field_A':'A'}
        list_columns = ['Field_A']
        base_filters = [['field_A', FilterEqual, 'abc']]`
    

    这只会显示field_A 变量等于abc 的行。

    希望这对某人有所帮助,因为我花了差不多 (叹气) 两个星期才弄明白...

    【讨论】:

      【解决方案2】:

      SQLALchemy 是一个 ORM(对象关系映射),这意味着您不必处理原始 SQL,您将调用您“构建”的函数(通过在您的情况下添加过滤器)。它将透明地生成一个 SQL 查询,执行它,并将结果作为 python 对象返回。

      我建议您再次仔细阅读有关过滤器的 sqlalchemy 文档,尤其是 filter_by : http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.filter_by

      这是使用 sqlalchemy 应用 WHERE 的最简单方法。 如果你已经正确声明了Table_A 的模型,你应该可以这样使用它:

      result = session.query(Table_A).filter_by(Field_A = 'some text').all()
      

      这里session.query(Table_A).filter_by(Field_A = 'some text')会生成SQL,.all()会执行它。

      【讨论】:

      • 感谢您的明确答复并澄清我走在正确的道路上。我确实遇到了您所指的 SQLAlchemy 查询文件管理器文档。然而,最后一个问题可能很明显,文档中没有说明:代码行 result = ...session.query... 在我的应用程序中的位置是什么?在模型或视图中?我看了上下,发现了很多查询示例,但没有一个显示代码插入的位置?
      • 那么您需要从数据库中的何处获取数据?这个问题的答案可能会有所不同。但是在您的情况下,例如,如果您想获取Table_A 的列表,您将在视图函数中调用查询函数,并将结果传递给flask 的render_template() 函数。
      • 假设我只想要名为“john”的用户列表?
      猜你喜欢
      • 2016-02-19
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多