1. 完成数据库迁移

作为应用(下面我们统称 app)通常都会需要使用数据表来完成状态或数据的保存,Django 自带的 app 也不例外。如果不同步这些应用的数据表到数据库中,而是直接启动项目,在 CMD 命令行就会打印警告信息,并且告知如何解决这个警告信息方法。如图 1 所示:

03Django初始化项目环境精讲_django

 

在图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

03Django初始化项目环境精讲_django_02

 

查看数据库

03Django初始化项目环境精讲_数据库_03

 

 这里使用一个命令就完成了数据库的迁移工作,但是有两点问题值得我们思考,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)