0x00 引言
再简单的事情,也需要有人去做。
0x01 需求
存在多个数据库,需要合并,数据库中相同表的结构是一样的。 主要是使用了Sqlite3的系统表sqlite_master。
0x02 Python 代码
# coding=utf-8
import sys, sqlite3, os
def merge_tables(tables_file_a, tables_file_b, con_file_a):
print("Start Merge Tables")
j = 0
while j < len(tables_file_b):
if not tables_file_b[j] in tables_file_a:
cur_table_file_a = con_file_a.cursor()
try:
cur_table_file_a.execute(tables_file_b[j][3:-3])
except:
print("Error: " + tables_file_b[j][3:-3])
j += 1
else:
j += 1
print("All Tables Merged!")
def merge_index(tables_file_a, tables_file_b, con_file_a):
print("Start Merge Index")
j = 0
while j < len(tables_file_b):
if not tables_file_b[j] in tables_file_a:
cur_table_file_a = con_file_a.cursor()
try:
cur_table_file_a.execute(tables_file_b[j][3:-3])
except:
print("Error: " + tables_file_b[j][3:-3])
j += 1
else:
j += 1
print("All Index Merged!")
def merge_data(con_current_data, con_des_data, tables_current_data):
m = 0
cur_current_data = con_current_data.cursor()
while m < len(tables_current_data):
sql_statement = "select * from " + tables_current_data[m][3:-3]
cur_current_data.execute(sql_statement)
temp_data_list = cur_current_data.fetchall()
n = 0
cur_des_data = con_des_data.cursor()
while n < len(temp_data_list):
sql_exist_statement = "select * from " \
+ str(tables_current_data[m])[3:-3] + \
' where COL_UID="' + temp_data_list[n][0] + '"'
cur_des_data.execute(sql_exist_statement)
temp_des_data_list = cur_des_data.fetchall()
cur_des_next_data = con_des_data.cursor()
if len(temp_des_data_list) == 0:
sql_temp = ""
nn = 0
try:
while nn < len(temp_data_list[n]):
sql_statement += '"' + temp_data_list[n][nn] + '",'
nn += 1
except:
print("Error " + sql_temp)
try:
cur_des_next_data.execute("insert into "
+ str(tables_current_data[m])[3:-3]
+ " values(" + sql_temp[0:-1] + ")")
cur_des_next_data.commit()
except:
print("Error " + sql_temp)
n += 1
else:
n += 1
m += 1
print("All Tables Data Merged!")
con_file_a = sqlite3.connect("~/a.db")
con_file_b = sqlite3.connect("~/b.db")
# 处理表
sql_table_statement = "select sql From sqlite_master Where type='table'"
cur_file_a = con_file_a.cursor()
cur_file_a.execute(sql_table_statement)
tables_file_a = cur_file_a.fetchall()
cur_file_b = con_file_b.cursor()
cur_file_b.execute(sql_table_statement)
tables_file_b = cur_file_b.fetchall()
merge_tables(tables_file_a, tables_file_b, con_file_a)
# 处理索引
sql_index_statement = "select sql From sqlite_master Where type='index'"
cur_file_a = con_file_a.cursor()
cur_file_a.execute(sql_index_statement)
tables_file_a = cur_file_a.fetchall()
cur_file_b = con_file_b.cursor()
cur_file_b.execute(sql_index_statement)
tables_file_b = cur_file_b.fetchall()
merge_index(tables_file_a, tables_file_b, con_file_a)
con_file_a.close()
con_file_b.close()
sql_data_statement = "SELECT name FROM sqlite_master WHERE type='table'"
cur_file_a = con_file_a.cursor()
cur_file_a.execute(sql_data_statement)
cur_file_b = con_file_b.cursor()
cur_file_b.execute(sql_data_statement)
tables_file_b = cur_file_b.fetchall()
merge_data(con_file_b, con_file_a, tables_file_b)
print("---------All Data Finished!--------")
0x03 后记
开始用Python做了这一版,后来用 Qt 重做了,所以这个最初版就放出来了。
0x04 UPDATE
2019-01-13