Django - 配置MySQL数据库和迁移命令

  • 作者:lwj
  • 分类:Django
  • 发表日期:2021-10-24 15:15:38
  • 阅读(38)
  • 评论(0)

安装依赖

Django默认使用SQLite数据库,使用MySQL数据库依赖第三方库,mysqlclientpymsql二选一

pip install mysqlclient
pip install pymsql

使用pymysql需要多配置一步,在项目同名目录下的init.py(mysite/mysite/init.py)文件中添加如下代码,即使用pymysql连接,使用mysqlclient则不需要

import pymysql
pymysql.install_as_MySQLdb()

配置MySQL与迁移

进入项目同名目录下setting.py文件,配置MySQL数据库,修改变量DATABASESMySQL数据如下:

# In mysite/mysite/setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 配置为mysql数据库
        'NAME': '数据库名称',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': 'IP地址',
        'PORT': '端口号',
    }
}

创建应用

python manage.py startapp books

创建模型

# In mysite/books/models.py文件
from django.db import models

# 自定义图书类
class BookInfo(models.Model):
    """图书模型"""
    title = models.CharField(max_length=200, verbose_name="书名")
    date = models.DateField(verbose_name="发布日期")
    bread = models.IntegerField(default=0, verbose_name="阅读量")
    comment = models.IntegerField(default=0, verbose_name="评论数")
    is_delete = models.BooleanField(default=False, verbose_name="软删除")

    class Meta:
        db_table = "tb_books"      # 自定义表的名字
        verbose_name = "图书"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title


# 自定义英雄模型类
class HeroInfo(models.Model):
    GENDER_CHOICES = (  # 枚举
        (0, 'female'),
        (1, 'male')
    )
    hero_name = models.CharField(max_length=20, verbose_name="英雄名称")
    # 默认值为0,只取元组GENDER_CHOICES中枚举的值
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name="性别")  # 默认值为0
    comment = models.CharField(max_length=200, null=True, verbose_name="描述信息")             # 可以为null值
    book = models.ForeignKey(to=BookInfo, on_delete=models.CASCADE, verbose_name="图书")       # 外键
    is_delete = models.BooleanField(default=False, verbose_name="软删除")

    class Meta:
        db_table = "tb_heros"
        verbose_name = "英雄"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hero_name

激活模型

# In mysite/mysite/setting
INSTALLED_APPS = [
    'polls.apps.BooksConfig',     # 注册books应用
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

生成迁移信息

python manage.py makemigrations books

结果如下:

Migrations for 'books':
  books\migrations\0001_initial.py
    - Create model BookInfo
    - Create model HeroInfo

通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 它们其实也只是一些你磁盘上的文件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在 polls/migrations/0001_initial.py 里。别担心,你不需要每次都阅读迁移文件,但是它们被设计成人类可读的形式,这是为了便于你手动调整 Django 的修改方式

查看待迁移信息

python manage.py sqlmigrate polls 0001

你将会看到类似下面这样的输出

--
-- Create model BookInfo
--
CREATE TABLE `tb_books` (`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(200) NOT NULL,
`date` date NOT NULL, `bread` integer NOT NULL, `comment` integer NOT NULL, `is_delete` bool NOT NULL);
--
-- Create model HeroInfo
--
CREATE TABLE `tb_heros` (`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY, `hero_name` varchar(20) NOT NUL
L, `gender` smallint NOT NULL, `comment` varchar(200) NULL, `is_delete` bool NOT NULL, `book_id` bigint N
OT NULL);
ALTER TABLE `tb_heros` ADD CONSTRAINT `tb_heros_book_id_dc38df6a_fk_tb_books_id` FOREIGN KEY (`book_id`)
REFERENCES `tb_books` (`id`);

1. 输出的内容和你使用的数据库有关

2. 数据库的表名如果未自定义则默认是由应用名(books)和模型名的小写形式( bookinfo和heroinfo)连接而来(如上结果为自定义的表名)

3. 主键(IDs)会被自动创建。(当然也可以自定义)

4.  Django会在外键字段名后自动追加字符串 "_id" (同样,这也可以自定义)

5. 生成的SQL语句是为你所用的数据库定制的

6. 这个命令并没有真正在你的数据库中的执行迁移 - 相反,它只是把命令输出到屏幕上,让你看看 Django 认为需要执行哪些 SQL 语句。这在你想看看 Django 到底准备做什么,或者当你是数据库管理员,需要写脚本来批量处理数据库时会很有用

数据库迁移

python manage.py migrate books

结果如下:

Operations to perform:
  Apply all migrations: admin, auth, books, contenttypes, sessions
Running migrations:
  Applying books.0001_initial... OK

这个migrate命令, 选中books下所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移)并应用在数据库上 - 也就是将你对模型的更改同步到数据库结构上

觉得不错,支持一下!

提交评论

您尚未登录,登录之后方可评论~ 登录 or 注册

评论列表

暂无评论
返回顶部

建议反馈

1. 可在博文底部留言评论

2. 发邮件到i_suichuan@163.com