繁体   English   中英

Function sqlite3 python 和锁定数据库的包装器

[英]Function wrapper for sqlite3 python and locked database

我写了一个复杂的 python3 应用程序,它利用了 sqlite3。 该程序是 asyncio,所以我使用的是 aiosqlite,它运行良好。 但是,我在这个程序中有几个事件循环,所以我必须为每个线程创建一个单独的数据库 object。 这工作正常,但问题是数据库每隔一段时间就会锁定并抛出OperationalError 我一直在通过捕获错误来管理它,这在大多数情况下都有效。 然而,每隔一段时间(不是太频繁,而是偶尔)数据库会因某些操作错误而崩溃。 不完全确定为什么我正在处理这些错误......但无论如何。 我在想如果我能做这样的事情会很酷......

async def retry_on_failure(func, args=(), kwargs={}):
    for _ in range(10):
        try:
            return func(*args, **kwargs)
        except sqlite3.OperationalError:
            print('Some error occurs! Waiting a sec ... ')
            await asyncio.sleep(3)

然后包装我的 sqlite class 函数,例如:

@retry_on_failure
async def select_list(table):
    ...

但这是行不通的。 我启动程序,它只是无限期地冻结。 有什么方法可以用装饰器包装我的 sqlite 调用,以尝试再次运行该命令,直到数据库解锁? 请记住,这些函数可能会从不同的事件循环中调用,但是 object 不会在事件循环之间共享(因为那根本不起作用)。

如果这不可能,那么我可以做一些事情,比如将我所有的 function 调用包装在 for 循环中(这就像......嗯。一个丑陋的解决方案。)或者我正在考虑做一个 sqlite 命令队列在那里我可以对一个队列进行 append 数据库调用,然后让一个主控 object 处理实际的数据库调用,将结果返回给调用它的任何线程,但是对于这样的问题,这可能需要更多的工作。 Idk,我只是认为使用装饰器会很酷。 是否可以?

我找到了答案.. 事实证明,这并不是一个真正的 sqlite3 问题,而是一个未正确实现的 asyncio function 包装器问题......这似乎有效!

from functools import wraps
@wraps
async def retry_on_failure(func, args=(), kwargs={}):
    for _ in range(10):
        print(f'Try {_}')
        try:
            return await func(*args, **kwargs)
        except sqlite3.OperationalError:
            await asyncio.sleep(1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM