【问题标题】:Async SQLite python [closed]异步 SQLite python [关闭]
【发布时间】:2019-03-11 22:45:21
【问题描述】:

我使用 aiogram 库编写异步电报机器人。我决定使用 SQLite 作为存储不可变值的数据库。如何从我的数据库中实现异步读取?

【问题讨论】:

  • 问题的第一部分显然是基于意见的,但第二部分(也是更重要的)是一个有用的问题,可以回答。鉴于 OP 是新的贡献者,我选择回答问题而不是投票结束。

标签: python python-3.x sqlite python-asyncio telegram-bot


【解决方案1】:

sqlite3 模块 already exists 的包装器,您应该在异步代码中使用它。

或者,您可以将同步调用转换为异步调用,方法是将它们包装在 run_in_executor 中。例如:

async def fetchall_async(conn, query):
    loop = asyncio.get_event_loop()
    return await loop.run_in_executor(
        None, lambda: conn.cursor().execute(query).fetchall())

这为您提供了一个可以从异步代码调用的协程,而不必担心长时间运行的执行会阻塞整个事件循环:

async def some_task():
    ...
    students = await fetchall_async(conn, "select * from students")

但最好将它留给经过良好测试的包。

【讨论】:

  • 谢谢。我可以将参数传递给execute()吗?执行(查询,(arg,))不起作用。
  • @dydoser 向execute 填充参数应该没有问题。这样做到底有什么不妥?
  • 上面提到的已经使用了一个执行器和单线程。有没有使用 libuv 更接近金属的东西?
  • @SamanthaAtkins 我不知道 - 也许您应该问一个问题,最好详细说明为什么现有解决方案不能满足您的要求。
  • PS:原来databases 使用aiosqlite 作为SQLite 支持的后端...
猜你喜欢
  • 2023-04-03
  • 2012-12-09
  • 2020-12-02
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2013-09-19
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多