flask-sqlalchemy或sqlalchemy


93

我是flask和sqlalchemy的新手,我只是开始在flask应用程序上工作,现在我正在使用sqlalchemy。我想知道使用flask-sqlalchemy与sqlalchemy是否可以获得任何显着的好处。我在http://packages.python.org/Flask-SQLAlchemy/index.html中找不到足够的动机,或者也许我不明白它的价值!谢谢您的澄清。


6
嗯,这里仍然没有令人满意的答案。谁能解释说在Flask应用程序中,实际的实际好处flask-sqlalchemysqlalchemy什么?
史蒂夫·贝内特

不过,一大缺点是,Flask-SqlAlchemy它没有提供任何在应用程序中设置多租户的方法。那是IMO最大的负面影响。binds仅提供将不同的数据库附加到不同的模型,而无法使用具有相同模型的特定于租户的数据库。
Rohit Jain

Answers:


67

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

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

在理想情况下,这将是的唯一功能Flask-SQLAlchemy,但实际上它仅增加了一些东西。这是一篇很好的博客文章,其中概述了它们:解密Flask-SQLAlchemy

当我第一次使用Flask和SQLAlchemy时,我不喜欢这种开销。我过去了,从扩展中提取了会话管理代码。尽管我发现正确进行此集成非常困难,但是这种方法行之有效。

因此,更简单的方法(在我正在研究的另一个项目中使用)是直接插入Flask-SQLAlchemy而不使用它提供的任何其他功能。您将拥有,db.session并且可以像纯粹的SQLAlchemy设置一样使用它。


4
我仍然感到困惑。链接的博客文章(和官方文档!)列出了一些简单的SQLAlchemy功能(例如声明性基础),就好像它们是Flask-SQLAlchemy功能一样。目前尚不清楚他们是否赞扬SQLAlchemy内置的东西,还是重新实现了它(也不知道为什么这样做,如果是后者)。您的第一段列出了两个功能:用于会话管理的便捷包装(但是,如果您想 Flask 之外使用SQLAlchemy模型,是否会需要自己滚动?)和一些未指定的“配置”以“与Flask应用一起使用”。那什么意思
Mark Amery

1
我对问题也有些困惑。链接的博客文章非常清楚IMO,例如,它说“支持查询属性和分页的自定义声明性基本模型”,关键是“自定义”,而“支持查询属性和分页”是它的基础。 SQLAlchemy的声明性基础。
鲍里斯·塞列布罗夫

1
关于“便利包装”-它们不是为了方便,而是为了使事情正常工作。要开始使用SQLAlchemy,您需要数据库连接(eninge /连接/会话)对象,并且您不想在每次进行SQL查询时都创建对象,因此应全局创建这些对象,并且可以在应用程序代码中使用这些对象。因此,您可以执行“从应用程序导入数据库”之类的操作,然后执行“ db.session.something()”,而无需考虑如何正确创建和初始化此“ db”对象。
鲍里斯·塞雷布罗夫

关于未指定的“配置”以“与Flask应用程序一起使用”-实际上是在第二段中指定的:This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.请参见SQLAlchemy文档中的更多详细信息:我何时构造会话,何时提交会话以及何时构造会话关闭吗?上下文/线程本地会话
鲍里斯·塞列布罗夫

20

老实说,我看不出任何好处。恕我直言,Flask-SQLAlchemy创建了您实际上不需要的附加层。在我们的案例中,我们有一个相当复杂的Flask应用程序,它同时使用ORM和Core进行多个数据库/连接(主从),其中,我们需要控制会话/数据库事务(例如dryrun与commit模式)。Flask-SQLAlchemy添加了一些附加功能,例如自动销毁会话,并为您准备了一些通常不需要的东西。


5
是的,在您的用例中,Flask-SQLAlchemy似乎已过时。但是如果OP会遇到这种情况,他可能不会问这个问题。对于对会话范围一无所知的新用户,Flask-SQLAlchemy绝对是必须的!
schlamar

20

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

使用Flask-SQLAlchemy的积极方面


  1. Flask_SQLAlchemy为您处理会话配置,设置和拆卸。
  2. 提供声明性基本模型,使查询和分页更加容易
  3. 后端特定设置。Flask-SQLAlchemy扫描已安装的库以获得Unicode支持,如果失败,则自动使用SQLAlchemy Unicode。
  4. 有一个方法叫做 apply_driver_hacks,可以自动将健全的默认设置设置为MySQL池大小之类的thig
  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__类List项来覆盖

使用Flask-SQLAlchemy的负面影响


  1. 使用Flask-SQLAlchemy会使从Flask迁移到金字塔(如果需要)的过程更加困难。这主要是由于Flask_SQLAchemy上的自定义声明性基础模型。
  2. 使用Flask-SQLAlchemy,您可能会面临使用比SQLAlchemy本身小的社区的软件包的风险,而我很快就无法轻易退出活跃的开发。
  3. 如果您不知道Flask-SQLAlchemy的一些出色功能,它们可能会让您感到困惑。

15

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

诸如Flask-SQLAlchemy之类的产品SQLAlchemy强烈建议使用这些产品。

您可以在会话常见问题的第二个问题中找到此报价和详细的动机。


2
Flask-sqlalchemy似乎无法维护。最近一次更新是在2013年8月1日。此建议是否有意义?
pmav99 2014年

只要您没有@ pmav99的具体问题,我仍然会推荐它,特别是对于新用户。
schlamar 2014年

1
截至2014年11月,似乎将得到积极维护。许多近期承诺。github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett

25
即使OP没有直接询问,imo。他想知道Flask-SQLAlchemy的好处。您的回答实际上是“即使您不知道好处是什么,也要使用它”-是的,好处是什么?
Markus Meskanen '16

1
此答案不能回答OP的问题。您建议使用flask-sqlalchemy,但没有在建议后面提供很多理由。
mbadawi23

7

就像@schlamar暗示Flask-SqlAlchemy是一件好事。Id只是想在此处添加一些额外的上下文。

不要觉得自己在选择一个。例如,假设我们要使用Flask-Sqlalchemy模型从表中获取所有记录。就这么简单

Model.query.all()

在很多简单的情况下,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()

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


1
“例如,假设我们要使用使用Flask-Sqlalchemy的模型从表中获取所有记录。这很简单Model.query.all()- 只需使用SQLAlchemy 即可完成所有操作,使用Flask-SQLAlchemy在这里绝对没有提供任何新功能。
Markus Meskanen '16

你真棒!我偶然发现了这个帖子,它解决了我遇到的一个问题。我安装anaconda之后,由于某种原因无法正常进行更新。从更改Model.query.all()db.session.query(Model).all()出于某种原因允许会话正常进行跟踪和更新。
杰夫·布鲁梅尔

2

这是flask-sqlalchemy给您的收益超过普通sqlalchemy的示例。

假设您正在使用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-sqlalchemy,则可以使用内置的SQLAlchemyAdapter。如果您使用的是sqlalchemy(not-flask-sqlalchemy),则可能对将对象保存到数据库的方式(例如表的名称)做出不同的假设,因此您必须编写自己的适配器类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.