Django执行数据库迁移的一些坑点
最近购买了阿里云的RDS,就想着不要在本机跑数据库了,毕竟本身也不是很安全,万一哪天出问题了,数据丢了就真的很郁闷了。但是我的站点和其他的站点都有一点数据,虽然数据不多,但是我也实在懒得在去全部复制粘贴一遍。所以就本身想先用django自带的数据迁移工具。
提前说明,此方法大家了解就好,千万不要用,真的是坑,会有很多意想不到的问题,后面我会在说
- 数据导出
python manage.py dumpdata > data.json- 数据导入
python manage.py loaddata data.json
这种方法乍一看之下很爽啊,直接把数据就备份出来了,然后直接执行又导入了,就算不明白数据库原理那些 貌似小白都可以直接用。但是存在很多意外的问题。我这里举例说一下我的情况
我的数据库本地docker里面跑的是MySQL 5.7,RDS的mysql版本也是5.7,两边都是一样的。
在我导入的时候首先是一直报错,在查看了一下错误的原因,表象一直是说 字段长度设置的问题,也有是因为在DATABASES里面的OPTIONS应该增加init_command字段说明等等,但是就奇怪了,我之前的本地版本这些都一样为啥就不用加呢。
然后在去深入查看生成的migrations文件夹下的sql内容的时候发现了一个问题。

注意看:
('email', models.EmailField(db_index=True, max_length=254, unique=True, verbose_name='邮箱')),
着他喵的什么鬼,原来django的ORM这货给EmailField实际产生的时候用的是verchat,然后设置了长度254,查询了一下网上的解释是说,数据库如果用的utf8mp4对长度有限制。但是解决方案就很麻烦了,又是要改mysql配置,要么就是修改这里修改哪里的。其他的问题还不知道有没有。所以这种方法隐形问题太多。非常不推荐。
数据迁移推荐方法
- 将之前在docker运行的mysql数据库进行备份
1、先进入容器docker exec -it xxxx /bin/bash
2、执行数据库备份命令mysqldump -u root -p db_name > db_name.sql,然后会在当前目录下生成一个db_name.sql文件,然后exit退出容器
3、在宿主机上执行docker cp 容器id:/dn_name.sql /home/,这里就是利用了docker的cp复制功能,将文件从容器中复制到宿主机中,格式是docker cp 容器id:容器内路径 宿主机路径
4、直接将文件下载到本地或者直接导入新数据库中即可。