连续记录到数据库 - 修复错误

时间:2015-07-23 11:20:42

标签: python sqlite

所以我有一个python模块接收数据并将其上传到数据库。 我有一个表运行状况检查,检查表是否存在,列数是否应该是什么,以及列的类型和名称。

所以我有一些像这样的代码:

def log_msg(message):
        try:
            insert(message)
        except sqlite3.OperationalError:
            table_health()
            log_msg(message)
如果表格有任何问题,

table_health()会删除该表格,并创建一个新表格。

我希望模块能够修复数据库,因为数据将被连续报告。这就是为什么我不想提出异常,我决定像那样处理它。

我也不想在执行查询之前检查运行状况,因为此运行状况检查是在模块导入时执行的,因此在执行之前表应该是正常的。如果在运行时删除/更改表,则会出现唯一的问题。但是大多数时间表应该没问题,所以在每次查询之前检查似乎都是浪费 - 因此检查错误。

我可以看到的只有可能的无限递归的解决方案是确保只在异常一次后执行log_msg。将其替换为insert(message) 因为如果表将被修复,它将在一次执行之后。否则出现问题

有关如何处理此事的任何建议吗?

2 个答案:

答案 0 :(得分:0)

您可以向log_msg添加一个参数,指示是否应该尝试修复该表。如果设置为false,则会引发异常:

def log_msg(message, fix_table=True):
    try:
        insert(message)
    except sqlite3.OperationalError:
        if fix_table:
            table_health()
            log_msg(message, False)
        else:
            raise

为什么你真的面临腐败表的问题?这听起来很可疑!另外,您是在多线程,多进程环境中运行吗?如果您不注意正确锁定,动态更改表格会导致问题。

答案 1 :(得分:0)

我最后使用了上一段中建议的方法。原因是:

  • 确保只有一次尝试来修复表格
  • 只有一次重试失败的方法
  • 如果捕获到异常并且要修复表 - 只需执行一次就可以解决该问题。如果没有 - 其他地方出现了问题

所以我保存了要调用的函数,如果有异常,我称之为,而不是包装函数:

def log_msg(message):
    call_insert = None
    args_insert = ()
    try:
        #Save the function in the variable
        #in the real code there is a number of different insert() calls
        call_insert = insert
        args_insert = message
        insert(message)
    except sqlite3.OperationalError:
        if fix_table:
            table_health()
            call_insert(*args)
        else:
            raise