后端(5)-sqlite3数据库如何导入RDS Mysql

114 阅读2分钟

python脚本处理sqlite3到mysql数据库文件

开始查了资料,大部分都推荐通过python脚本将sqlite3数据库改成mysql支持的格式。

原理是执行dump生成一个sql文件,再用脚本将sqlite3数据库中和mysql不兼容的部分都修改了,比如TEXT修改成VARCHAR(255)等,然后就变成了mysql支持的数据库格式。

但是因为原本的sqlite3中用到了外键,所以这种方式多次尝试始终不成功。

开源方案处理

开源库中有一个sqlite3-to-mysql,是将sqlite数据库导入到本机的mysql数据库中,试了一下,还是失败了,因为我原本的sqlite3中用到了外键,并且我的外键是用的字符串,而不是整型,所以报错了。

issue链接

 Adding foreign key to attendance.link_to_member referencing member.None
2023-06-27 09:00:33 ERROR    MySQL failed adding foreign key to attendance.link_to_member referencing member.None: 1170 (42000): BLOB/TEXT column 'link_to_member' used in key specification without a key length

原因就是原本的sqlite3中用到了TEXT作为外键,但是并没有指定这个外键的长度,所以失败了。

解决办法

1、外键改成整型

外键对应的是其他表的主键,虽然是字符串保存的,但是本身其实是数字整型,所以其实是可以将起类型改成整数的,所以这里先对sqlite中的外键列类型改成了整型

2、sqlite3导入本地mysql

然后再执行上面的sqlite3-to-mysql,就成功了。

sqlite3mysql -f sqlite3数据库文件名 -d 本地mysql数据库名 -u 本地mysql数据库用户名 -p

输入密码,等待成功即可。

3、本地mysql中数据库导出

mysqldump -u 本地mysql数据库用户名 -p 本地mysql要导出的数据库名 > 导出后要保存的数据库文件名.sql

4、导入阿里云RDS

mysql -h 阿里云RDS内网或者外网地址 -u RDS数据库用户名 -p RDS数据库名称 < 步骤3中到处的数据库名称.sql

等待片刻,没有报错,就代表导入RDS成功了