背景
近期有涉及到如何将.so类型的数据库文件转换为.db类型,从而能够使用Navicat等图形化工具查看表结构和数据,这里贴上转换代码做个记录。
代码
import sqlite3
def convert_so_to_db(so_file, db_file):
# 打开 .so 文件
conn = sqlite3.connect(so_file)
cursor = conn.cursor()
# 创建新的 .db 文件
new_conn = sqlite3.connect(db_file)
new_cursor = new_conn.cursor()
# 复制表结构和数据
cursor.execute("SELECT name, sql FROM sqlite_master WHERE type='table' AND name != 'sqlite_sequence';")
tables = cursor.fetchall()
for table_name, create_table_sql in tables:
new_cursor.execute(create_table_sql)
cursor.execute(f"SELECT * FROM {table_name};")
rows = cursor.fetchall()
for row in rows:
placeholders = ', '.join(['?' for _ in row])
new_cursor.execute(f"INSERT INTO {table_name} VALUES ({placeholders})", row)
# 复制索引
cursor.execute("SELECT name, sql FROM sqlite_master WHERE type='index';")
indexes = cursor.fetchall()
for index_name, create_index_sql in indexes:
if create_index_sql is not None:
new_cursor.execute(create_index_sql)
# 复制视图
cursor.execute("SELECT name, sql FROM sqlite_master WHERE type='view';")
views = cursor.fetchall()
for view_name, create_view_sql in views:
if create_view_sql is not None:
new_cursor.execute(create_view_sql)
# 复制触发器
cursor.execute("SELECT name, sql FROM sqlite_master WHERE type='trigger';")
triggers = cursor.fetchall()
for trigger_name, create_trigger_sql in triggers:
if create_trigger_sql is not None:
new_cursor.execute(create_trigger_sql)
# 提交并关闭连接
new_conn.commit()
new_conn.close()
conn.close()
# 调用函数进行转换
convert_so_to_db('wacai365.so', 'wacai365.db')