flask-sqlalchemy或sqlalchemy

Ami*_*min 81 python sqlalchemy flask flask-sqlalchemy

我是烧瓶和sqlalchemy的新手,我刚刚开始研究烧瓶应用程序,我现在正在使用sqlalchemy.我想知道使用flask-sqlalchemy vs sqlalchemy是否有任何重大好处.我在http://packages.python.org/Flask-SQLAlchemy/index.html找不到足够的动机,或者我不明白这个价值!非常感谢您的澄清.

Bor*_*rov 56

它的主要特点Flask-SQLAlchemy是与Flask应用程序的正确集成 - 它创建和配置引擎,连接和会话,并将其配置为与Flask应用程序一起使用.

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

在理想的世界中,这将是唯一的特征Flask-SQLAlchemy,但实际上它增加了更多的东西.这是一篇很好的博客文章,概述了它们:揭开Flask-SQLAlchemy的神秘面纱.

当我第一次使用Flask和SQLAlchemy时,我不喜欢这种开销.我过去从扩展中提取会话管理代码.这种方法有效,但我发现很难正确地进行这种集成.

因此,更简单的方法(在我正在处理的另一个项目中使用)就是Flask-SQLAlchemy放入并且不使用它提供的任何其他功能.你将拥有它db.session,你可以使用它,就像它是纯粹的SQLAlchemy设置.

  • 我仍然感到困惑.链接的博客文章(和官方文档!)列出了一些简单的SQLAlchemy功能(如声明性基础),就像它们是Flask-SQLAlchemy功能一样; 目前还不清楚他们是否因为SQLAlchemy内置的东西而获得赞誉,或者他们已经重新实现了它(也不是*为什么*他们这样做,如果是后者的话).你的第一段列出了两个功能:会话管理的便利包装(但是如果你想在*Flask之外使用你的SQLAlchemy模型,你也不需要自己滚动吗?)和一些未指定的"配置"来使用烧瓶应用程序"*.那是什么意思*? (4认同)
  • 我也有点被问题搞糊涂了。链接的博客文章非常清楚 IMO,例如,它说“支持查询属性和分页的自定义声明性基础模型”关键是“自定义”和“支持查询属性和分页”是它添加的内容SQLAlchemy 的声明性基础。 (2认同)
  • 关于“便利包装器” - 它们不是为了方便,而是为了使事情正常工作。要开始使用 SQLAlchemy,您需要数据库连接(eninge / 连接 / 会话)对象,并且您不想在每次需要进行 SQL 查询时都创建这些对象,因此应该全局创建这些对象并且可以在整个应用程序代码中使用这些对象。因此,您可以执行“from yourapplication import db”之类的操作,然后执行“db.session.something()”,而无需考虑如何正确创建和初始化此“db”对象。 (2认同)

MOC*_*KBA 18

说实话,我没有看到任何好处.恕我直言,Flask-SQLAlchemy创建了一个你真正不需要的附加层.在我们的例子中,我们有一个相当复杂的Flask应用程序,它具有多个使用ORM和Core的数据库/连接(主从),其中包括我们需要控制会话/数据库事务(例如,干运行与提交模式).Flask-SQLAlchemy添加了一些额外的功能,例如自动销毁会话,假设有些东西通常不是你需要的东西.

  • 是的,在您的使用案例中,Flask-SQLAlchemy似乎已过时.但如果OP有这样的情况,他可能不会问这个问题.对于对*会话范围一无所知的新用户*Flask-SQLAlchemy绝对是必须的! (5认同)

Kim*_*kka 16

Flask-SQLAlchemy为您提供了许多额外的功能,您最终将使用SQLAlchemy实现自己.

使用Flask-SQLAlchemy的积极方面


  1. Flask_SQLAlchemy为您处理会话配置,设置和拆解.
  2. 为您提供声明性基本模型,使查询和分页更容易
  3. 后端特定settings.Flask-SQLAlchemy扫描已安装的lib以获得Unicode支持,如果失败则自动使用SQLAlchemy Unicode.
  4. 有一个调用的方法apply_driver_hacks会自动将默认的默认值设置为像MySQL池大小一样的thigs
  5. 有很好的构建方法create_all()和drop_all()来创建和删除所有表.如果你做了一些愚蠢的事情,对于测试和在python命令行中很有用
  6. 它给你get_or_404()而不是get()和find_or_404()而不是find()代码示例> http://flask-sqlalchemy.pocoo.org/2.1/queries/

自动设置表名.Flask-SQLAlchemy自动设置表名称转换你的ClassName> class_name可以通过设置__tablename__类列表项来覆盖它

使用Flask-SQLAlchemy的否定方面


  1. 使用Flask-SQLAlchemy会为从Flask迁移添加额外的困难,如果你需要,可以说Pyramid.这主要是由于Flask_SQLAchemy上的自定义声明基本模型.
  2. 使用Flask-SQLAlchemy您可能会冒险使用比SQLAlchemy本身小得多的社区,我不能轻易地从活动开发中删除它.
  3. Flask-SQLAlchemy有一些很好的附加功能可以让你感到困惑,如果你不知道他们在那里.


sch*_*mar 15

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

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

您可以在会话常见问题解答的第二个问题中找到此引用和详细动机.

  • 即使OP没有直接询问,imo.他想知道Flask-SQLAlchemy的好处.您的答案实际上是"即使您不知道其中的好处也会使用它" - 是的,有什么好处? (22认同)
  • Flask-sqlalchemy 似乎没有维护。最后一次更新是在 2013 年 8 月 1 日。这个建议是否更有意义? (3认同)
  • 这个答案没有回答OP的问题。您推荐flask-sqlalchemy,但没有提供推荐背后的太多理由。 (2认同)

Mik*_*tes 7

正如@schlamar建议Flask-SqlAlchemy是一个好东西.我想在这里添加一些额外的上下文.

不要觉得你选择的是另一个.例如,假设我们想使用Flask-Sqlalchemy使用模型从表中获取所有记录.它很简单

Model.query.all()
Run Code Online (Sandbox Code Playgroud)

对于很多简单的案例,Flask-Sqlalchemy会完全没问题.我想提出的另一点是,如果Flask-Sqlalchemy不会做你想要的,那么没有理由你不能直接使用SqlAlchemy.

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()
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们可以轻松地从一个跳到另一个,而在第二个示例中,我们实际上使用的是Flask-Sqlalchemy定义的模型.

  • “例如,假设我们想要使用 Flask-Sqlalchemy 的模型从表中获取所有记录。它就像 `Model.query.all()` 一样简单”——这一切都可以通过 *just* SQLAlchemy 来完成,使用Flask-SQLAlchemy 在这里绝对没有提供任何新内容。 (5认同)
  • “对于很多简单的情况,Flask-Sqlalchemy 完全没问题”——哪些简单的情况?到底什么是“一切都会好起来”?“Flask-SqlAlchemy 确实是个好东西。” - 为什么?这篇文章提出的问题多于它给出的答案,并且没有阐明 Flask-SqlAlchemy 相对于 SqlAlchemy 提供的功能。 (2认同)