sqlitel转mysql_数据库04sqlite转mysql

本文探讨了将SQLite数据库迁移到MySQL的几种方法,包括手动和脚本替换SQL语句、使用Django的makemigrations以及尝试利用Django的主从数据库机制。尽管尝试的方法存在各种挑战,如SQL兼容性、数据类型转换和主键依赖问题,但最终选择了通过Django在MySQL中生成新表的方式,由于数据量不大,手动初始化了数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思路:sqlite导出sql保存到mysql

1,sqlite导出sql,手工替换

2,sqlite导出sql,脚本替换

3,makemigrations生成mysql表,数据:sqlite=>csv=>mysql

4,django主从数据库机制,将sqlite同步到mysql

sqlite导出sql1

2

3

4sqlite3 database.sqlite3

sqlite3> .output /path/to/dump.sql

sqlite3> .dump

sqlite3> .exit

or1sqlite3 database.sqlite3 .dump

01,sqlite=>mysql语句修改

为了保证SQL语句的兼容,需要将SQLite的特有的格式,修改为MySQL的格式。下面为我总结的一般规则(下面的方括号应被忽略):1

2

3

4

5

6

7

8

9

10将 ["] 改为 [`]

也可以移除全部的 ["] ,但是如果有一些函数名作为字段名(e.g. regexp)时将会遇到错误

需要注意一些默认为 ["] ,其作用不在字段上的,不应被替换而应当被保留

移除所有的 [BEGIN TRANSACTION] [COMMIT] 以及 任何包含 [sqlite_sequence] 的(整)行

将所有 [autoincrement] 改为 [auto_increment]

将所有 ['f'] 改为 ['0'] 并将所有 ['t'] 改为 ['1']

或者['False']改为['0']及['True']改为['1']

text字段不能设置unipue,需改为varchar(255)

注意sqlite是不区分类型的,所以有些整形字段和text字段要修改配合mysql。

默认设为CURRENT_TIMESTAMP的字段类型一定为TIMESTAMP。

将修改完的文件保存。

放弃,太麻烦且容易错,无法复用。

02,sqlite转mysql格式脚本

以上脚本收集整合到githubsqlite-to-mysql

可惜的是没有一个可以直接使用的,简单的表可以搞定,一旦涉及复杂的字段,比如datetime等,就会踩坑。

放弃!

03,makemigrations方案

django makemigrations生成mysql表,数据:sqlite=>csv=>mysql

前半部分可以:makemigrations在mysql创建新表

后半部分不行:csv数据sqlite导出导入mysql,失败。django支持利用json导出导入数据,也失败。

04,django主从数据库机制

主要参考:

django sqlite3迁移到mysql:www.voidcn.com/article/p-hesvaooz-ru.html

数据表创建成功,但迁移数据时失败。

思路上查询出对象在保存到从数据库是没问题的,实际上由于数据存在主键依赖,导致创建表或记录的前后次序有特定要求,自动查询的化未必符合这种要求。

另一个问题就是这种方案会对django的默认数据表也进行迁移,也会产生主键依赖问题。

总结

没找到合适方案可以简单快速的迁移,最后采用03方法,django在mysql生成新表。由于目前测试数据并不多,所以数据由各个模块开发人员自行初始化。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值