【问题标题】:Do I need to use SQLAlchemy sessions?我需要使用 SQLAlchemy 会话吗?
【发布时间】:2017-04-30 08:38:51
【问题描述】:

SQLAlchemy 的官方教程提供了使用会话系统的示例,例如:

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)

许多非官方教程也使用会话,但是有些根本不使用它们,而是选择了任何一种称为这种方法的方法:

e = create_engine('sqlite:///company.db')
conn = e.connect()
query = conn.execute("SELECT first_name FROM employee")

当这个简单得多的系统似乎在做同样的事情时,为什么还需要会话?据我所知,官方文档并没有明确说明为什么需要这样做。

SQLAlchemy 官方文档中有一个特别相关的部分:

Web 应用程序是最简单的情况,因为这样的应用程序已经围绕一个单一的、一致的范围构建——这就是请求,它表示来自浏览器的传入请求,处理该请求以形成响应,最后是将该响应返回给客户端。将 Web 应用程序与 Session 集成就是将 Session 的范围链接到请求的范围的简单任务。会话可以在请求开始时建立,也可以使用惰性初始化模式在需要时立即建立。然后请求继续进行,其中应用程序逻辑可以以与访问实际请求对象的方式相关联的方式访问当前会话的某个系统到位。当请求结束时,Session 也会被拆除,通常是通过使用 Web 框架提供的事件挂钩。 Session 使用的事务也可以在此时提交,或者应用程序可以选择显式提交模式,只提交那些有保证的请求,但仍然总是在最后无条件地拆除 Session。

...和...

一些网络框架包括基础设施来协助完成以下任务 使 Session 的生命周期与 Web 请求的生命周期保持一致。这个 包括 Flask-SQLAlchemy 等产品,可结合使用 使用 Flask Web 框架和 Zope-SQLAlchemy,通常与 金字塔框架。 SQLAlchemy 建议将这些产品 可用时使用。

不幸的是,我仍然不知道我是否需要使用会话,或者最后一段是否暗示某些实现(例如 Flask-SQLAlchemy)已经在自动管理会话。

我需要使用会话吗?不使用会话是否存在重大风险?我是否已经在使用会话,因为我正在使用 Flask-SQLAlchemy?

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    正如您所指出的,如果您只使用纯 SQLAlchemy Core 构造和执行查询,则会话并不是绝对必要的。但是,它们提供了利用SQLAlchemy ORM 所需的更高抽象层。 Session 维护修改后的模型图,并确保在必要时将更改有效且一致地刷新到数据库中。

    由于您已经使用 Flask-SQLAlchemy,即使您不需要 ORM 功能,我也没有理由避免使用会话。该扩展程序处理隔离请求所需的所有管道,因此您不必重新发明轮子并可以专注于您的应用程序代码。

    【讨论】:

    • 感谢您的意见!我决定我将实施会话。 :)
    • @KaiM。不客气,如果有帮助,请随时勾选答案。
    【解决方案2】:

    如果您想使用 ORM 功能,您需要会话:

    • 更改查询返回的对象的某些属性并轻松将其写回数据库

    • 使用普通的 python 构造函数创建一个对象,并轻松将其发送回数据库

    • 在对象上有关系。因此,例如,如果您有一个博客,并且您有一个帖子对象,则可以编写 post.author 来访问负责该帖子的用户对象。

    我还要注意,即使您使用 Session,您实际上也不需要 sessionmaker。在 Web 应用程序中,您可能需要它,但如果您希望简单,可以使用这样的会话:

    from sqlalchemy import create_engine
    from sqlalchemy.orm import Session
    
    engine = create_engine(...)
    session = Session(bind = engine)
    

    同样,我认为您可能希望在您的应用中使用 sessionmaker,但您不需要它来让会话工作

    【讨论】:

    • 按照教程我最终得到了这个:app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL'] db = SQLAlchemy(app) # deleted code db.session.add(some_model) 虽然我对有多少种连接到数据库的方法有点困惑。我希望这是完全有效/良好的做法。
    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多