首页 文章

flask-sqlalchemy或sqlalchemy

提问于
浏览
65

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

6 回答

  • 15

    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可以让你感到困惑 .

  • 7

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

  • 15

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

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

    这个引用和详细的动机你可以在Session FAQ的第二个问题中找到 .

  • 1

    这是一个福利瓶的例子 - 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),你可能会对对象保存到数据库的方式做出不同的假设(比如表的名称),因此你必须编写自己的适配器类 .

  • 10

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

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

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

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

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

  • 41

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

    不要觉得你选择的是另一个 . 例如,假设我们想使用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定义的模型 .

相关问题