gpt4 book ai didi

sqlite - 更新时创建 Sqlite 数据库补丁

转载 作者:行者123 更新时间:2023-12-03 19:30:48 25 4
gpt4 key购买 nike

语境:
python 3.6 脚本每天使用 sqlite3 多次更新 Sqlite 数据库。模块。
数据库是~500Mo,每次更新加起来~250Ko。

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

问题:
有没有办法使用 Python(通过 DB-API 2.0 interface 或使用 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_trace_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()

关于sqlite - 更新时创建 Sqlite 数据库补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com