从MySQL迁移数据至SQLite失败,如何生成兼容脚本或自动转换?
这种情况太常见了!MySQL和SQLite的语法差异确实不小,mysqldump默认导出的脚本里一堆SQLite不认的东西。我给你几个靠谱的解决办法,从简单调整到省心工具都有:
方法1:调整mysqldump参数,生成更兼容的初始脚本
先从源头减少不兼容内容,给mysqldump加几个参数,让它输出尽量贴近SQLite的语法:
mysqldump --compatible=sqlite --no-create-db --skip-lock-tables --skip-comments -u 你的MySQL用户名 -p 要迁移的数据库名 > mysql_dump.sql
每个参数的作用:
--compatible=sqlite:强制mysqldump生成SQLite兼容的语法--no-create-db:去掉CREATE DATABASE语句(SQLite不需要创建数据库,直接操作.db文件)--skip-lock-tables:避免生成LOCK TABLES和UNLOCK TABLES(SQLite不支持这些命令)--skip-comments:移除所有COMMENT相关的语句(SQLite不支持表/列的注释)
方法2:用脚本批量修复现有SQL文件
如果已经有了导出的脚本,用sed、awk这类工具批量替换不兼容内容:
- 删掉LOCK/UNLOCK TABLES语句:
sed -i '/^LOCK TABLES/d; /^UNLOCK TABLES/d' mysql_dump.sql
- 移除所有COMMENT子句:
sed -i '/COMMENT/d' mysql_dump.sql
- 处理
ON UPDATE(比如ON UPDATE CURRENT_TIMESTAMP):
sed -i 's/ON UPDATE CURRENT_TIMESTAMP//g' mysql_dump.sql
- 转换MySQL的
KEY为SQLite的CREATE INDEX:
MySQL的KEY是在CREATE TABLE里定义的,SQLite需要单独的建索引语句。可以用这个awk脚本处理:
BEGIN { in_create=0; table_name="" } /^CREATE TABLE/ { in_create=1; match($0, /`([^`]+)`/, tbl); table_name=tbl[1]; print $0; next; } /^)/ && in_create { in_create=0; print $0; next; } in_create && /^ KEY/ { match($0, /`([^`]+)` \(([^)]+)\)/, idx); print "CREATE INDEX " idx[1] " ON " table_name " (" idx[2] ");"; next; } { print $0; }
把脚本存为convert_keys.awk,然后运行:
awk -f convert_keys.awk mysql_dump.sql > converted_dump.sql
方法3:用专门的迁移工具(最省心)
手动改脚本容易漏,推荐用现成的迁移工具——mysql-to-sqlite3,它能直接连接MySQL数据库,自动处理所有语法差异,直接导出到SQLite文件:
- 安装工具:
pip install mysql-to-sqlite3
- 执行迁移:
mysql2sqlite -f 目标SQLite文件名.db -u MySQL用户名 -p MySQL密码 -d 要迁移的MySQL数据库名
这个工具会自动处理数据类型转换(比如MySQL的INT(11)转SQLite的INTEGER)、自增主键、索引等问题,几乎不用手动干预。
额外注意事项
- SQLite没有
ENUM类型,迁移时会自动转成TEXT,如果有需要可以后续用约束补充 - SQLite的
INTEGER PRIMARY KEY会自动实现自增,不需要AUTOINCREMENT(除非你要求严格不重用已删除的ID) - 大字段(比如MySQL的
TEXT/BLOB)在SQLite里都能正常存储,不用额外处理
内容的提问来源于stack exchange,提问作者altralaser
相关产品推荐
相关产品推荐

