使用python asyncio正确使用sqlalchemy scoped_session

时间:2015-12-19 09:23:20

标签: python python-3.x sqlalchemy python-asyncio

我正在使用asyncio构建应用。我将使用sqlalchemy作为orm。 根据我的理解,scoped_session将一个会话与一个线程相关联,这样他们就不会相互操作。 既然asyncio在单个线程上工作,我相信scoped_session将无法正常工作,这将导致问题。 将sqlalchemy会话与asyncio一起使用的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

答案取决于您的代码。

通常,您可以使用sessionmaker创建会话工厂并自行使用它。

如果您的代码具有隐式上下文,则可以scoped_session使用自定义scopefunc,如example所示。

隐式上下文可能会使用asyncio.Task.current_task()调用,但您还需要找到一种范围内的会话销毁方法。

答案 1 :(得分:1)

我认为你不能将sqlalchemy用于asyncio。 SQL Alchemy API全部阻止并与asyncio不兼容。 http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/

可以与gevent异步使用SQL Alchemy,只要您可以为数据库找到与gevent兼容的驱动程序。而gevent greenlents很好地映射到scoped_session

编辑:实际上,只要你能为数据库找到asyncio兼容的驱动程序,例如https://github.com/aio-libs/aiopg,看起来可以将SQL Alchemy与asyncio一起使用。至于scoped_session,请使用current_task并在您的网络框架的请求端销毁它。