咨询+【QQ】
sqlite轻量数据还行,随着数据量增大,不得不迁移进mysql
首先 电脑执行
sqlite3 db.sqlite3 .dump > dump.sql
会把整个sqlite的数据导出进 dump.sql中
紧接着我们把sqlite的sql转换成mysql的sql语句,因为mysql语句和 sqlite的sql有区别,所以我们需要用python实现一个转换脚本
import re
def convert_sqlite_to_mysql(sql):
# 移除 PRAGMA 语句
sql = re.sub(r'PRAGMA .*?;', '', sql)
# 修改 BEGIN TRANSACTION 为 START TRANSACTION
sql = sql.replace('BEGIN TRANSACTION;', 'START TRANSACTION;')
# 替换 COMMIT TRANSACTION 为 COMMIT
sql = sql.replace('COMMIT;', 'COMMIT;')
# 替换 ROLLBACK TRANSACTION 为 ROLLBACK
sql = sql.replace('ROLLBACK;', 'ROLLBACK;')
# 修改 AUTOINCREMENT 为 AUTO_INCREMENT
sql = sql.replace('AUTOINCREMENT', 'AUTO_INCREMENT')
# 替换数据类型
sql = sql.replace('INTEGER', 'INT')
sql = sql.replace('TEXT', 'VARCHAR(255)')
# 替换双引号为反引号
sql = sql.replace('"', '`')
# 添加 CHARACTER SET utf8mb4 到表定义中
sql = re.sub(r'CREATE TABLE `(.*?)` \(', r'CREATE TABLE IF NOT EXISTS `\1` (', sql)
# sql = re.sub(r'\);', r') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;', sql)
# 处理 INSERT 语句,确保数据字符集正确
sql = re.sub(r'INSERT INTO `(.*?)` \((.*?)\) VALUES', r'INSERT INTO `\1` (\2) VALUES', sql)
sql = re.sub(r'INSERT INTO `sqlite_sequence`.*?;', '', sql)
return sql
# 读取原始的 SQLite dump 文件
with open('dump.sql', 'r', encoding='utf-8') as file:
sql_dump = file.read()
# 转换为 MySQL 兼容的 SQL
mysql_compatible_sql = convert_sqlite_to_mysql(sql_dump)
# 将转换后的 SQL 写入新的文件
with open('dump_mysql.sql', 'w', encoding='utf-8') as file:
file.write(mysql_compatible_sql)
print("SQL conversion complete. Please check 'dump_mysql.sql' for MySQL import.")
执行py脚本生成dump_mysql.sql
这样就转换好了,紧接着进入mysql创建数据库 mydatabase
CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mydatabase;
去mysql安装目录,执行。linux直接执行此命令就行
mysql -u root -p mydatabase < dump_mysql.sql
#如果遇到中文报错\u等报错,数据导入的时候就需要用一下命令,指定字符集导入进mysql
mysql --default-character-set=utf8mb4 -u root -p mydatabase < dump_mysql.sql
然后输入mysql对应的密码,就行了
等待数据转存完,就行了。可能会报一个 sqlite_sequence 之类的异常,并不影响数据。至此就行了