Django 数据库的迁移、备份与恢复(MySQL)

标签: Django Python MySQL

Django 数据库的迁移、备份与恢复(MySQL)

本文解决Django在部署时迁移数据库的问题,同时也可作用于数据库的备份。个人认为,相比直接导出数据库,这种方式更使用于Django开发的网站。尽管同步可能会有些麻烦,但避免了migration报错的风险,备份的命令也可以通过脚本来自动运行。

前置知识:Django进阶,MySQL入门,Linux基本操作,Django & MySQL安装。

备份

1. 导出指定表的数据

注:不使用sqlyog

  • 模板:
mysqldump -t database -u username -ppassword --tables table_name1 table_name2 table_name3 >D:\db_script.sql
  • 实例:
mysqldump -t blog -uroot -ppassword --tables index_tui index_tag index_friendlink index_category user_user index_article index_article_tags > C:\Users\ASUS\Desktop\try\all.sql 

导出的表数据存放在:C:\Users\ASUS\Desktop\try\all.sql

2. 妥善存放文件

最好下载下来或云备份

数据恢复

0. 创建新数据库

数据库一定要与settings.py里的一样 使用新的数据库,确保数据库为空,不然django_migrations表里的数据可能会和makemigrations命令发生冲突。具体解决请另行搜索,但多一事不如少一事。

create database database_name default charset 'utf8';
show databases;
use database_name;
show tables;

1. Django 迁移文件

确保magrations文件夹里没有除__init__之外的文件

python3.8 manage.py makemigrations
python3.8 manage.py migrate

此时所有表里的数据都为空

2. 迁移数据

打开之前导出数据的all.sql文件(用记事本或类似的编辑器就行)。 可以发现,里面有这样的一块一块的数据:

LOCK TABLES index_tui WRITE; /!40000 ALTER TABLE index_tui DISABLE KEYS /; INSERT INTO index_tui VALUES (1,'首页一号位'),(2,'首页二号位'),(3,'首页三号位'); /!40000 ALTER TABLE index_tui ENABLE KEYS /; UNLOCK TABLES;

每一块都是一张表内的数据,我们只要insert语句:

INSERT INTO index_tui VALUES (1,'首页一号位'),(2,'首页二号位'),(3,'首页三号位');

可能有多行insert语句记得复制全。

打开MySQL

mysql -uroot -p
# 输入密码

进入数据库 可以发现django创建的表

use database_name;
show tables;

将刚刚复制的insert语句粘贴过来并执行。 注意:

  1. 表内如果涉及外键,一定根据外键先后顺序插入数据,先导入没有外键的表,再根据外键顺序导入其他表。

  2. 如果在类里和user建立了外键(比如class Article里通常会在author里带ForeignKey),记得导出数据时一块导出user表里的数据并先导入。

3. 进入/admin页面查看效果

如果没有同步user表,可以现在django里创建superuser再登录进去。

python3.8 manage.py createsuperuser

p.s.

附sqlyog可视化导出数据方法:

https://www.bilibili.com/video/BV1BE411v7zC

MySQL导出数据参考:

https://www.cnblogs.com/linjiqin/p/11888943.html