更新时创建Sqlite数据库修补程序

更新时创建Sqlite数据库修补程序,sqlite,python-3.x,diff,patch,python-db-api,Sqlite,Python 3.x,Diff,Patch,Python Db Api,上下文: python 3.6脚本正在使用模块每天更新Sqlite数据库数次。 数据库容量约为500万,每次更新加起来约为250Ko 问题: 我提供数据库的每个更新版本,并希望减少传输数据的大小。换句话说,我只想传输更新的内容(通过一种补丁)。 实用程序可以用于此目的,但是,每次我更新数据库时,它都需要创建数据库的本地副本。 问题: 有没有一种方法,使用Python(通过或使用Python中的其他方法),在更新数据库时生成这种补丁 最初的想法: 在执行提交之前/执行提交时,是否可以基于游标编写

上下文:
python 3.6脚本正在使用模块每天更新Sqlite数据库数次。
数据库容量约为500万,每次更新加起来约为250Ko

问题:
我提供数据库的每个更新版本,并希望减少传输数据的大小。换句话说,我只想传输更新的内容(通过一种补丁)。
实用程序可以用于此目的,但是,每次我更新数据库时,它都需要创建数据库的本地副本。

问题:
有没有一种方法,使用Python(通过或使用Python中的其他方法),在更新数据库时生成这种补丁


最初的想法:
在执行提交之前/执行提交时,是否可以基于游标编写修补程序(例如,更新数据库所要执行的操作列表)

import sqlite3

# Open database
conn = sqlite3.connect('mydb.db')
cur = conn.cursor()

# Insert/Update data
new_data = 3.14
cur.execute('INSERT INTO mytable VALUES (?)', (new_data,))

# KEEP TRACK & Save (commit) the changes 
conn.dump_planned_actions()  # ?????
conn.commit()
conn.close()

下面的代码片段显示了我找到的解决方法

它依赖Sqlite3方法
set\u trace\u callback
记录所有发送的SQL语句,并
executescript
应用这些语句

import sqlite3

class DBTraceCallbackHandler(object):
    """Class handling callbacks in order to log sql statements history."""
    def __init__(self):
        self.sql_statements = []
    def instance_handler(self, event):
        self.sql_statements.append(str(event))

def database_modification(cursor):
    # user-defined
    pass

def create_patch(db_path):
    # Openning connection
    conn = sqlite3.connect(db_path)
    c = conn.cursor()
    # Start tracing sql
    callback_handler = DBTraceCallbackHandler()
    conn.set_trace_callback(callback_handler.instance_handler)
    # Modification of database
    database_modification(c)
    # End of modification of database
    conn.commit()
    c.close()
    # Generating the patch - selecting sql statements that modify the db
    idx_rm = []
    for idx, sql_statement in enumerate(callback_handler.sql_statements):
        if not any([sql_statement.startswith(kw) for kw in ['UPDATE', 'INSERT', 'CREATE']]):
            idx_rm.append(idx)
    for idx in sorted(idx_rm, reverse=True):
        del callback_handler.sql_statements[idx]

    return ';\n'.join(callback_handler.sql_statements) + ';\n'


def apply_patch(db_path, sql_script):
    # Openning connection
    conn = sqlite3.connect(db_path)
    c = conn.cursor()
    # Modification of database - apply sql script
    c.executescript(sql_script)
    # End of modification of database
    conn.commit()
    c.close()

Python中未启用。@CL。您知道解决方法吗?谢谢