【问题标题】:How do I access the SQLAlchemy database from my Flask extension?如何从我的 Flask 扩展访问 SQLAlchemy 数据库?
【发布时间】:2013-08-31 19:16:31
【问题描述】:

我为我当前的 Flask 项目构建了一个简单的权限系统,我想将它分解为一个扩展,以便我可以共享它并在其他项目中使用它。我正在为如何获取用户的 SQLAlchemy 数据库连接以在我的扩展程序中使用而苦苦挣扎。

具体来说,我想在数据库中为使用我的扩展程序的任何人创建一些模型。我确定有这样做的模式,但我不知道。

我在这里添加了更多信息http://bit.ly/1dqubJQ

【问题讨论】:

    标签: python database sqlalchemy flask


    【解决方案1】:

    您只是希望用户能够在您的扩展程序中使用他们的 sqlalchemy 连接,对吗?为什么不把它放在 init 中?

    class FlaskExtension(object):
    
        # db below is the user's sqlalchemy connection
        def __init__(self, app=None, db=None):
            self.app = app
            self.db = db
            if app is not None and db is not None:
                self.init_app(app,db)
    

    【讨论】:

      【解决方案2】:

      我喜欢解决此类问题的一种模式是不让扩展定义数据库模型,而是提供开发人员可以从中继承模型的 mixin 类。除了 mixin(s) 之外,您还可以有回调函数,用于从数据库加载或保存模型等操作,也由应用开发者提供。

      例如,Flask-Login 使用了这种技术。我喜欢它,因为它使扩展数据库不可知。你说你有兴趣为 SQLAlchemy 做这件事,但是如果你发布你的扩展,有人会想在某个时候将它与 Mongo、Peewee 或没有 ORM 层一起使用。如果您对扩展中的数据库引擎不做任何假设,所有这些都将得到支持。

      【讨论】:

      • 嗯,这很有趣,值得考虑。优点很清楚(你描述得很好)。我想考虑一些缺点(除了应用程序之间更紧密的耦合以减少与数据库的耦合)。例如,在我使用过的库中,我从未真正在 Django 中看到过这种模式。
      • Django 是固执己见的,找到使用与您不同的 ORM 的人的可能性较小,因为只有一个,如果您决定超越它,您还有很多额外的工作。使用 Flask,你不能做出太多假设,几乎所有东西都有选择。
      猜你喜欢
      • 2020-07-14
      • 1970-01-01
      • 2019-03-20
      • 2016-09-27
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多