Django执行数据库迁移的一些坑点

发布时间:2020-11-11 浏览量: 83 文章分类: 运维相关

最近购买了阿里云的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内容的时候发现了一个问题。

django数据库迁移

注意看: ('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/,这里就是利用了dockercp复制功能,将文件从容器中复制到宿主机中,格式是docker cp 容器id:容器内路径 宿主机路径

4、直接将文件下载到本地或者直接导入新数据库中即可。