烧瓶炼金术

我在烧瓶和 sql伟力方面都是新手,我刚开始开发烧瓶应用程序,现在我正在使用 sql伟力。我想知道使用烧瓶炼金术和烧瓶炼金术是否有明显的好处。我找不到足够的动机在 http://packages.python.org/Flask-SQLAlchemy/index.html或也许我不明白的价值! !我希望你能解释清楚。

44060 次浏览

SQLAlchemy 文档明确指出,您应该使用 Flask-SQLAlchemy (特别是如果您不了解它的好处!) :

[ ... ] Flask-SQLAlchemy [ ... ]等产品强烈建议使用这些产品。

这个引用和一个详细的动机,你可以在 常见问题的第二个问题中找到。

说实话,我看不出有什么好处。恕我直言,Flask-SQLAlchemy 创建了一个你并不真正需要的附加层。在我们的例子中,我们有一个相当复杂的 Flask 应用程序,它有多个数据库/连接(主-从) ,使用 ORM 和 Core,其中,我们需要控制我们的会话/DB 事务(例如,dryrun 对提交模式)。Flask-SQLAlchemy 增加了一些额外的功能,例如会话的自动销毁,假设您需要一些通常不是您所需要的东西。

正如@schlamar 所说,Flask-SqlAlchemy 绝对是个好东西。我只是想给这个观点添加一些额外的上下文。

不要觉得你选择了其中一个。例如,假设我们希望使用 Flask-Sqllegy 模型从一个表中获取所有记录。这很简单

Model.query.all()

对于很多简单的情况,烧瓶炼金术是完全没问题的。我想说的另外一点是,如果烧瓶炼金术不能达到你的目的,那么你没有理由不能直接使用它。

from myapp.database import db


num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()


db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()

正如您所看到的,我们可以轻松地从一个模型跳到另一个模型,没有任何问题,在第二个示例中,我们实际上使用的是 Flask-Sqltancy 定义的模型。

下面是一个有益的烧瓶的例子—— sql 炼金术比普通的 sql 炼金术给你带来了更多的好处。

假设您正在使用 flask _ user。

Flask _ user 自动创建和验证用户对象,因此它需要访问您的数据库。类 UserManager 通过调用称为“适配器”的东西来实现这一点,该适配器对数据库调用进行抽象。在 UserManager 构造函数中提供一个适配器,适配器必须实现以下功能:

class MyAdapter(DBAdapter):
def get_object(self, ObjectClass, id):
""" Retrieve one object specified by the primary key 'pk' """
pass


def find_all_objects(self, ObjectClass, **kwargs):
""" Retrieve all objects matching the case sensitive filters in 'kwargs'. """
pass




def find_first_object(self, ObjectClass, **kwargs):
""" Retrieve the first object matching the case sensitive filters in 'kwargs'. """
pass


def ifind_first_object(self, ObjectClass, **kwargs):
""" Retrieve the first object matching the case insensitive filters in 'kwargs'. """
pass


def add_object(self, ObjectClass, **kwargs):
""" Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
pass


def update_object(self, object, **kwargs):
""" Update object 'object' with the fields and values specified in '**kwargs'. """
pass


def delete_object(self, object):
""" Delete object 'object'. """
pass


def commit(self):
pass

如果您正在使用 flask-sqlchemy,那么可以使用内置的 SQLAlchemyAdapter。如果您正在使用 sqlchemy (not-flask-sqlchemy) ,您可能会对对象保存到数据库的方式(比如表的名称)做出不同的假设,因此您必须编写自己的适配器类。

Flask-SQLAlchemy的主要特点是与 Flask 应用程序的正确集成-它创建和配置引擎、连接和会话,并配置它与 Flask 应用程序一起工作。

这个设置非常复杂,因为我们需要创建 限定范围的会议并根据 Flask 应用程序请求/响应生命周期正确处理它。

在理想的情况下,这将是 Flask-SQLAlchemy的唯一功能,但实际上,它几乎没有增加更多的东西。查看 那些文件获得更多信息。或者看看这篇博客文章的概述: 解密烧瓶-SQLAlchemy(更新: 原文目前不可用,有一个 Webarchive 上的快照)。

当我第一次使用 Flask 和 SQLAlchemy 时,我不喜欢这种开销。我仔细检查并从扩展中提取了会话管理代码。这种方法可以工作,尽管我发现很难正确地进行这种集成。

因此,更简单的方法(我正在开发的另一个项目中使用的方法)是只放入 Flask-SQLAlchemy,不使用它提供的任何附加特性。您将有 db.session,您可以使用它,如同它是纯 SQLAlchemy设置。

Flask-SQLAlchemy 为您提供了许多不错的附加功能,否则您最终将使用 SQLAlchemy 实现自己。

使用 Flask-SQLAlchemy 的积极方面


  1. Flask _ SQLAlchemy 为您处理会话配置、安装和拆卸。
  2. 提供声明性基本模型,使查询和分页更加容易
  3. Flask-SQLAlchemy 扫描已安装的 Unicode 支持库,如果失败,将自动使用 SQLAlchemy Unicode。
  4. 有一个名为 apply_driver_hacks的方法,该方法自动为 MySQL 池大小等设置合理的默认值
  5. 具有用于创建和删除所有表的 create _ all ()和 drop _ all ()方法的良好内置。对于测试非常有用,如果您做了一些愚蠢的事情,可以在 python 命令行中使用
  6. 它在 > http://flask-sqlalchemy.pocoo.org/2.1/queries/处给出 get _ or _ 404()而不是 get ()和 find _ or _ 404()而不是 find ()代码示例

自动设置表名。Flask-SQLAlchemy 会自动设置转换 ClassName > class_name的表名,这可以通过设置 __tablename__类来覆盖 列表项目

使用 Flask-SQLAlchemy 的负面影响


  1. 使用 Flask-SQLAlchemy 将增加 如果你需要的话,可以从 Flask 移民到,比如说金字塔。这主要是由于 Flask _ SQLAchemy 上的定制声明性基础模型。
  2. 使用 Flask-SQLAlchemy 可能会使用一个比 SQLAlchemy 本身小得多的社区的包,我不能很快就从活动开发中删除它。
  3. 一些不错的额外 Flask-SQLAlchemy 可以让你感到困惑,如果你不知道他们在那里。