【问题标题】:Blocking database driver & async web framework阻止数据库驱动程序和异步 Web 框架
【发布时间】:2020-10-07 22:14:46
【问题描述】:

虽然 ORM 通常对异步不友好,但也有异步 Web 框架。尽管在您的数据库与服务器托管在同一本地网络中以提供普通服务的典型场景中,是否有任何理由关心这一点?毕竟,与外部网络请求相比,网络 I/O 到数据库的等待时间可以忽略不计。

在我的具体情况下,我有一个 Python aiohttp Web 服务器,我想连接到一个 PostgreSQL 数据库。我很想使用 SQL Alchemy 作为 ORM 层,尽管这意味着阻塞请求,因为 SQL Alchemy ORM 层不支持异步数据库驱动程序(有替代品,例如 GINO 或 async-peewee,尽管它们不适合生产在我的情况下使用)。这个问题适用于任何可能愿意发出阻塞请求的异步 Web 服务器。

这在任何地方都没有真正讨论过。争论是你是否愿意放弃使用稳定但同步的 ORM 来使用异步 Web 服务器。考虑到数据库将与服务器位于同一网络中,我在这里监督是否有任何危害?

如果您使用的 ORM 可能会基于属性或方法访问对数据库隐式发出 SQL 查询,则可以生成线程来生成这些阻塞请求,尽管这在您的应用程序中更需要管理。

【问题讨论】:

    标签: python async-await sqlalchemy blocking aiohttp


    【解决方案1】:

    只需使用 databases - 它支持 async 驱动程序和 SQL Alchemy。您可以从 Alchemy ORM 中提取 query 并异步执行。

    但是如果你有遗留代码 - 包装它

    def runsql(session):
        return session.query(...).filter(...).all()
    
    result = await loop.run_in_executor(
            None, functools.partial(runsql, session))
    

    【讨论】:

    • 这是一个非常好的选择,我会考虑的,谢谢!但有一件事:它不支持 SQL Alchemy 作为 ORM,它支持 SQL Alchemy Core 进行查询构建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多