关于数据库初始化方面的所有细节
前言:(一步骤是对数据库操作的整体流程的介绍。二步骤之后再来看看每一步的具体作用,相信你在仔细看完本流程之后,可以解决90%以上的django关于数据库问题,因为有一位超级大佬,7年工作经验,仍然被这其中的基础知识绊住了将近2个小时(当然,当时已经是深夜了,任谁的精力也不是非常集中)。)
一:先来看看django的数据库的整体配置初始化流程
1: setting文件中配置INSTALLED_APPS 选项
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'rpamanagee.apps.RpamanageeConfig',
'clouddisk.apps.ClouddiskConfig',
'betweenrpaclouddisk.apps.BetweenrpaclouddiskConfig',
'sqltables.apps.SqltablesConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
2: setting文件中配置ATABASES 选项
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'snake0517', # 数据库密码
}
}
3: python manage.py makemigrations (生成迁移文件)
4: python manage.py sqlmigrate polls 0001 (查看sql操作的语句)
5: python manage.py migrate (提交执行sql)
6: 数据库中的`django_migrations`表,这个表非常重要,是django每次扫描应用模型之后,再去数据库
中要比对的一张表,如果你的数据库表不小心删除了一个,而你又想要去用python manage.py去初始化表,
同时这张表中又有原来那张表的记录,那么django就会报错:** table is existed。
这点非常重要,因为我们就是在这里栽倒的。
二:详细解释setting文件的INSTALLED_APPS
1: setting文件中配置INSTALLED_APPS 选项
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'rpamanagee.apps.RpamanageeConfig',
'clouddisk.apps.ClouddiskConfig',
'betweenrpaclouddisk.apps.BetweenrpaclouddiskConfig',
'sqltables.apps.SqltablesConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
这里的配置作用是什么呢?? 很简单,就是告诉django,这是我想要包含的应用,如果你需要初始化
一个模块的数据库,但是你忘记把他添加到这里了,那么这个模块的数据库就不会被初始化。这并不是一件坏事,因
为有时候你确实是不需要数据库模型,只需要接口提供服务即可。
记住,要把你想要初始化数据库模型的模块加到这里,
如果你不想要为某一模块初始化数据库,那么就不要加,或者你的整个django只是一个web应用不需要
任何数据库,那么你就直接让INSTALLED_APPS 为空即可
来自官方的解释:INSTALLED_APPS 默认激活了一些应用,但并不是每个人都需要它们。如果你不需要某个或
某些应用,你可以在运行 migrate 前毫无顾虑地从 INSTALLED_APPS 里注释或者删除掉它们。 migrate 命令
只会为在 INSTALLED_APPS 里声明了的应用进行数据库迁移。
三:详细解释setting文件的DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 33306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
这里需要注意的地方不多,主要是提供一些数据库的连接信息,但是这里要确保你提供的数据库用户具有数据库
的增删改查权限。
四:django的CML: python manage.py makemigrations
通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新
的数据模型),并且把修改的部分储存为一次 迁移。
迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 它们其实也只是一些你磁盘上
的文件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在 django应用/migrations
/0001_initial.py 里。别担心,你不需要每次都阅读迁移文件,但是它们被设计成人类可读的形式,这是为了便
于你手动调整 Django 的修改方式。
这一步的作用: 检测你有没有修改django的模型文件,如果有则取改变迁移文件,如果没有则迁移文件保持不变。
注意: 这一步,并不会去提交操作数据库。
五:django的CML: python manage.py sqlmigrate
语法: python manage.py sqlmigrate 应用 迁移版本
eg: python manage.py sqlmigrate polls 0001
python manage.py sqlmigrate polls 0002
python manage.py sqlmigrate clouddisk 0001
作用: 查看模型文件的sql语句版本。emmm这个或许对于自动化运维有一些帮助吧。
六:django的CML:python manage.py migrate
python manage.py migrate (提交执行sql)
简单描述: 提交迁移文件,并与数据库中的django_migrations 表做比对,看看迁移文件与这个表中的记录的迁移文件的版本是否一致,如果
一致则不做修改,如果发生变化,则按照提交来修改!
来自官方的解释:
migrate 命令选中所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的数据库表django_migrations 来跟踪执行过哪些
迁移)并应用在数据库上 - 也就是将你对模型的更改同步到数据库结构上。
迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失
数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:
编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移。
数据库迁移被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更
加简单,也给别的开发者和生产环境中的使用带来方便。
七:数据库表:django_migrations
这是任何django项目中都会存在的数据库表。用来记录当前数据库对应的迁移文件的版本,每次python
manage.py migrate做迁移文件提交时,会与此表中的迁移文件版本做比对。一致则不做修改,如果发生变化,则
按照提交的迁移文件来修改!
如图:
请碰到问题一定要具体情况具体分析,官方文档一定是你最后的臂膀-_-