1. 完成数据库迁移
作为应用(下面我们统称 app)通常都会需要使用数据表来完成状态或数据的保存,Django 自带的 app 也不例外。如果不同步这些应用的数据表到数据库中,而是直接启动项目,在 CMD 命令行就会打印警告信息,并且告知如何解决这个警告信息方法。如图 1 所示:
在图1中,用红色方框标注的的就是 Django 的警告信息,告诉我们安装在 INSTALLED_APPS 列表中应用如 admin、auth、session 等需要进行数据库迁移。而且它还告诉我们如何进行迁移,就是使用如下命令来进行数据表的迁移:
python manage.py migrate
提示:“迁移”就是把 Django 默认自带应用的数据表迁移到我们自己的创建的数据库里,有点像搬家的意思,migrate 这个单词的含义就是“迁移”。
不过这里暂时不要执行 python manage.py migrate 等到数据库配置后在执行
2. PyMySQL模块的使用
在项目的 __init__.py 文件中写入
import pymysql pymysql.install_as_MySQLdb()
如果没有安装 pymysql 执行 pip install pymysql
在settings.py中修改数据库
将原来的替换为这个
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'book_test',#数据库名 'USER':'root',#数据库账号 'PASSWORD':'root',#数据库密码 'HOST':'127.0.0.1', 'PORT':'3306', } }
需要先去数据库创建这个数据库 不会自动创建数据库d的
现在完成数据库迁移 !执行
python manage.py migrate
查看数据库
这里使用一个命令就完成了数据库的迁移工作,但是有两点问题值得我们思考,migrate 是怎么知道要创建哪些表的,而且如果这些表修改了,它又怎样去维护这些表与数据库中已经迁移的表保持一致呢?下面我们来解答这个疑惑。
Django 对于数据库的迁移工作通过两个命令来实现,一个就是我们上面介绍的 migrate 命令,另个命令如下所示:
python manage.py makemigrations
makemigrations 命令会检测应用目录下是否存在 migrations 目录,如果没有则进行创建。首先,会根据应用的表结构定义生成一个 0001_inital.py 文件,里面定义了数据表的结构。
1) makegrations生成数据库迁移文件
当数据表更改后,我们首先执行 makemigrations 命令,然后 Django 会重新生成一个新的数据库迁移文件用来记录表结构之间的差异,命名规则是对上一个迁移文件的序列号加1,如 0002_xxx、0003_xxx。
2) migrate执行数据库迁移命令
之后,再次执行 migrate 命令让新的迁移文件生效并同步回数据库,从而完成表结构定义的修改。对于 Django 内置的应用,数据库迁移文件已经生成好了,所以直接使用 migrate 命令即可。
所以在我们并没有编写数据库内容直接使用migrate
3) 完成数据库迁移总结
每一次数据表更改后,都需要执行下面的两个命令,它们的执行顺序如下所示:
python manage.py makemigrations
python manag.py migrate
为了保证已经完成的迁移工作不会重复的执行,Django 会把每一次数据库迁移记录到 django_migrations 表中,每一次执行 migrate 命令前都会比较迁移文件是否已经记录在表中了,只有没出现过的才会执行。若想查看当前项目的第一次 migrate 生成的迁移记录,可以在 MySQL 命令行界面使用如下命令查看 :
select * from django_migrations;
输出结果如下所示:
mysql> select * from django_migrations; +----+--------------+------------------------------------------+----------------------------+ | id | app | name | applied | +----+--------------+------------------------------------------+----------------------------+ | 1 | contenttypes | 0001_initial | 2020-03-31 17:53:24.328380 | | 2 | auth | 0001_initial | 2020-03-31 17:53:24.772333 | | 3 | admin | 0001_initial | 2020-03-31 17:53:25.304430 | | 4 | admin | 0002_logentry_remove_auto_add | 2020-03-31 17:53:25.389557 | | 5 | admin | 0003_logentry_add_action_flag_choices | 2020-03-31 17:53:25.400529 | | 6 | contenttypes | 0002_remove_content_type_name | 2020-03-31 17:53:25.483671 | | 7 | auth | 0002_alter_permission_name_max_length | 2020-03-31 17:53:25.499663 | | 8 | auth | 0003_alter_user_email_max_length | 2020-03-31 17:53:25.523571 | | 9 | auth | 0004_alter_user_username_opts | 2020-03-31 17:53:25.540536 | | 10 | auth | 0005_alter_user_last_login_null | 2020-03-31 17:53:25.584193 | | 11 | auth | 0006_require_contenttypes_0002 | 2020-03-31 17:53:25.589585 | | 12 | auth | 0007_alter_validators_add_error_messages | 2020-03-31 17:53:25.599557 | | 13 | auth | 0008_alter_user_username_max_length | 2020-03-31 17:53:25.617511 | | 14 | auth | 0009_alter_user_last_name_max_length | 2020-03-31 17:53:25.635472 | | 15 | auth | 0010_alter_group_name_max_length | 2020-03-31 17:53:25.653411 | | 16 | auth | 0011_update_proxy_permissions | 2020-03-31 17:53:25.664380 | | 17 | sessions | 0001_initial | 2020-03-31 17:53:25.688552 | +----+--------------+------------------------------------------+----------------------------+ 17 rows in set (0.00 sec)