我是烧瓶和sqlalchemy的新手,我刚刚开始研究烧瓶应用程序,我现在正在使用sqlalchemy . 我想知道使用flask-sqlalchemy vs sqlalchemy是否有任何重大好处 . 我在http://packages.python.org/Flask-SQLAlchemy/index.html找不到足够的动机,或者我不明白这个 Value !非常感谢您的澄清 .
我是烧瓶和sqlalchemy的新手,我刚刚开始研究烧瓶应用程序,我现在正在使用sqlalchemy . 我想知道使用flask-sqlalchemy vs sqlalchemy是否有任何重大好处 . 我在http://packages.python.org/Flask-SQLAlchemy/index.html找不到足够的动机,或者我不明白这个 Value !非常感谢您的澄清 .
6 回答
Flask-SQLAlchemy为您提供了许多额外的功能,您最终将使用SQLAlchemy实现自己 .
使用Flask-SQLAlchemy的正面
Flask_SQLAlchemy为您处理会话配置,设置和拆解 .
为您提供声明性基本模型,使查询和分页更容易
后端特定设置.Flask-SQLAlchemy扫描已安装的lib以获得Unicode支持,如果失败则自动使用SQLAlchemy Unicode .
有一个名为
apply_driver_hacks
的方法,它自动将默认的默认值设置为像MySQL池大小一样的thigs具有很好的构建方法create_all()和drop_all(),用于创建和删除所有表 . 如果你做了一些愚蠢的事情,对于测试和在python命令行中很有用
它给你get_or_404()而不是get()和find_or_404()而不是find()代码示例> http://flask-sqlalchemy.pocoo.org/2.1/queries/
自动设置表名 . Flask-SQLAlchemy自动设置转换
ClassName
>class_name
的表名,可以通过设置__tablename__
class List项来覆盖它使用Flask-SQLAlchemy的否定方面
使用Flask-SQLAlchemy将为迁移添加额外的困难如果你需要的话,让Flask说金字塔 . 这主要是由于Flask_SQLAchemy上的自定义声明基本模型 .
使用Flask-SQLAlchemy,您可能会冒险使用比SQLAlchemy本身小得多的社区,我不能轻易地从活动开发中删除它 .
如果你不知道他们在那里,Flask-SQLAlchemy可以让你感到困惑 .
说实话,我没有看到任何好处 . 恕我直言,Flask-SQLAlchemy创建了一个你真正不需要的附加层 . 在我们的例子中,我们有一个相当复杂的Flask应用程序,它有多个数据库/连接(主从),同时使用ORM和Core,其中包括我们需要控制会话/数据库事务(例如,dryrun vs commit模式) . Flask-SQLAlchemy添加了一些额外的功能,例如自动销毁会话,假设有些东西通常不是你需要的东西 .
SQLAlchemy文档明确指出您应该使用Flask-SQLAlchemy(特别是如果您不了解它的好处!):
这个引用和详细的动机你可以在Session FAQ的第二个问题中找到 .
这是一个福利瓶的例子 - sqlalchemy为您提供简单的sqlalchemy .
假设您正在使用flask_user .
flask_user自动创建和验证用户对象,因此需要访问您的数据库 . UserManager类通过调用一个抽象数据库调用的“适配器”来实现这一点 . 您在UserManager构造函数中提供适配器,并且适配器必须实现这些功能:
如果您使用的是flask-sqlalchemy,则可以使用内置的SQLAlchemyAdapter . 如果你正在使用sqlalchemy(not-flask-sqlalchemy),你可能会对对象保存到数据库的方式做出不同的假设(比如表的名称),因此你必须编写自己的适配器类 .
Flask-SQLAlchemy
的主要功能是与Flask应用程序的正确集成 - 它创建和配置引擎,连接和会话,并将其配置为与Flask应用程序一起使用 .这个设置非常复杂,因为我们需要创建scoped session并根据Flask应用程序请求/响应生命周期正确处理它 .
在理想的世界中,这将是
Flask-SQLAlchemy
的唯一特征,但实际上它增加了更多的东西 . 这是一篇很好的博客文章,概述了它们:Demystifying Flask-SQLAlchemy .当我第一次使用Flask和SQLAlchemy时,我不喜欢这种开销 . 我过去从扩展中提取会话管理代码 . 这种方法有效,但我发现很难正确地进行这种集成 .
因此,更简单的方法(在我正在处理的另一个项目中使用)就是删除
Flask-SQLAlchemy
并且不使用它提供的任何其他功能 . 你将拥有db.session
,你可以使用它,好像它是纯粹的SQLAlchemy
设置 .正如@schlamar建议Flask-SqlAlchemy是一个好东西 . 我只是想在那里添加一些额外的上下文 .
不要觉得你选择的是另一个 . 例如,假设我们想使用Flask-Sqlalchemy使用模型从表中获取所有记录 . 它很简单
对于很多简单的案例,Flask-Sqlalchemy会完全没问题 . 我想提出的另一点是,如果Flask-Sqlalchemy不会做你想要的,那么你没理由不能直接使用SqlAlchemy .
正如您所看到的,我们可以轻松地从一个跳到另一个而没有任何问题,在第二个示例中,我们实际上使用的是Flask-Sqlalchemy定义的模型 .