问题描述
异步Web框架在这里,尽管ORM通常不异步。尽管在通常情况下您的数据库与用于平均服务的服务器托管在相同的本地网络中,是否有任何理由要考虑这一点?毕竟,与外部网络请求相比,网络I / O到数据库的等待时间可以忽略不计。
在我的特定情况下,我有一个要连接到Postgresql数据库的Python aiohttp Web服务器。我很想将sql Alchemy用作ORM层,尽管这意味着阻止请求,因为sql Alchemy ORM层中不支持异步数据库驱动程序(有一些替代品,例如gino或async-peewee,尽管它们对于生产不是很可靠在我的情况下使用)。这个问题适用于所有可能愿意发出阻止请求的异步Web服务器。
这在任何地方都没有讨论。争论的焦点是您是否愿意为了使用异步Web服务器而放弃使用稳定但同步的ORM。考虑到数据库将与服务器位于同一网络中,我在这里监督的问题是否存在?
如果您使用的ORM可能会基于属性或方法访问隐式向数据库发出SQL查询,则可以在应用程序中管理线程,从而可以生成线程来发出这些阻塞请求。
解决方法
只需使用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))