写点什么

Django 笔记二之连接数据库、执行 migrate 数据结构更改操作

作者:Hunter熊
  • 2023-04-06
    北京
  • 本文字数:2743 字

    阅读完需:约 9 分钟

Django笔记二之连接数据库、执行migrate数据结构更改操作

本文首发于微信公众号:Hunter 后端

原文链接:Django笔记二之连接数据库、执行migrate数据结构更改操作


本篇笔记目录索引如下:


  1. Django 连接 mysql,执行数据库表结构迁移步骤介绍

  2. 操作数据库,对数据进行简单操作


接下来几篇笔记都会介绍和数据库相关,包括数据库的连接、操作(包括增删改查)、对应的字段类型、model 里 Meta 相关参数和 QueryAPI 的详解等。


这一篇先介绍数据库的连接和简单的增删改查操作。


首先介绍一些 Django 的操作表的逻辑,Django 提供了一套非常方便的 orm 方法,可用于 Django 能直接对表和数据进行增删改查,对应的数据库里每一张表都有一个对应的 model 的 class,class 下每一个字段都对应 mysql 中表的字段,我们在 Django 中定义好这些内容,然后通过命令迁移到 数据库中来完成修改。

1、Django 连接 mysql

前一篇笔记我们创建了 一个 名为 polls 的 application,接下来我们要在 polls 下面建立和数据库的连接。


连接上 mysql 分为以下几步:


  • 安装依赖

  • 创建数据库

  • 修改 settings.py 填写数据库信息

  • 迁移默认表

  • 定义 model 信息

  • 生成 migrations 文件

  • 执行表的迁移

安装依赖

Django 和 mysql 连接需要安装一个 driver,我们这里选择 mysqlclient,以下是安装命令:


pip3 install mysqlclient -i https://mirrors.aliyun.com/pypi/simple/
复制代码


还是通过 -i 指定源,加速安装。

创建数据库

可以自己在服务器或者本地安装一个可以运行的 mysql,我这里安装的是 mysql 5.7 版本。


创建数据库的时候记得指定编码为 utf-8:


create database func_test default character set='utf8'
复制代码


在这里,数据库名称为 func_test,库编码为 utf-8。

修改 settings.py 填写数据库信息

在 hunter/settings.py 文件下,有一个 DATABASES 的变量,将其修改为以下内容:


DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'func_test',        "USER": "user",        "PASSWORD": "password",        "HOST": "xx.xx.xx.xx",        "PORT": 3306,    }}
复制代码


其中,default 表示系统默认连接的数据库,一个 Django 系统可以连接多个数据库,可以通过这个地方定义变量名称来指定。如果需要连接多个数据库,后续的操作可以再介绍。在使用的时候通过 using() 来区分 ENGINE:在这里值为 django.db.backends.mysql ,表示连接的数据库类型是 mysqlNAME:表示连接的数据库名称,在这里我们指定的是 func_testUSER:连接数据库使用的用户名 PASSWORD:连接数据库用户名对应的密码 HOST:你的数据库的地址,本地的话是 localhost 或者 127.0.0.1,服务器上填写相应的 ip 即可 PORT:端口,mysql 默认是 3306


以上的那些变量,记得更换成本地的变量。


好了,关于数据库的基本连接配置就都设置完成了。

迁移默认表

Django 系统里是有一些默认的配置表的,比如用户表,如果使用 Django 的默认用户系统的话可以用上 django_session 表,用于记录用户的登录的 session 相关记录 django_migrations 表,记录每一次表及字段的创建和修改操作等等


这些表,在我们执行以下操作命令的时候,会自动写入数据库:


python3 manage.py migrate
复制代码

定义 model 信息

在上一篇笔记里我们创建了一个名为 polls 的 application,里面有一个 models.py 的文件,然后我们编辑该文件,内容如下:


from django.db import models
class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published')

class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
复制代码


在上述文件里,每一个 class 代表着一张表,每一行都代表着 表里的一个字段,字段的类型在上述的文件里对应数据库的类型为:CharField:varcharDateTimeField:datetimeIntegerField:intForeignKey:外键这个类型我们后续会再介绍,这里只做一个简单的介绍。


然后我们还需要将我们这个 model 注册到我们的 settings.py 里的 INSTALLED_APPS:


INSTALLED_APPS = [    'polls.apps.PollsConfig',    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',]
复制代码

生成 migrations 文件

我们定义好 model 文件之后,在生成表结构之前,我们还需要生成一个 记录表结构变化的文件,也就是我们的 migrations 文件,每一次修改都可以生成一个新的 migration 文件,然后写入数据库,该文件存放在 每一个 application 的 migrations 文件夹下面。生成 migrations 文件命令:


python3 manage.py makemigrations polls
复制代码


然后我们可以看到在 polls/migrations/ 文件夹下多了一个 0001_initial.py

执行表的迁移

然后执行下面的命令,Django 会根据系统里上一次在 django_migrations 表里记录的上一次执行的地方,检测我们系统里新增的 migrations 文件,自动将数据结构的更改适配到数据库里:


python3 manage.py migrate polls
复制代码


如果对 model.py 再进行一次更改,然后执行 makemigrations 命令,migrations 文件夹下会自动新增新的迁移命令。每一个新增的前面都会有序号标识,比如我们最开始的是 0001,之后每一次都会按照序号往后新增。有兴趣的可以看看 migrations 里的文件内容,那是 python 语言里对应 SQL 的更改内容,这里不做展开,有兴趣的可以看看。


如果我们想在每一次执行 migrate 前,查看会对数据库进行怎么样的更改,可以根据 我们上面说的 序号,来指定 migration 文件查看:


python3 manage.py sqlmigrate polls 0001
复制代码


python3 manage.py sqlmigrate 是固定语法,polls 是对应的 application 的名称,0001 是每一次 migration 的前面的序号,这样就可以指定到 application 下的每一次更改。


比如上面那条命令,输出的结果如下:



会将转义执行到 数据库的语句打印出来。

2、操作数据库,对数据进行简单操作

现在我们根据上述的操作,创建了两张表和对应的 model,接下来介绍怎么对数据进行操作:


比如我们要创建一个 Question 数据,使用 Django 的语法来创建,可以通过 以下命令进入 Django 的交互界面:


python3 manage.py shell
复制代码


然后挨个输入:


from polls.models import Questionq = Question(question_text="quesiton_text_1", pub_date="2022-01-01 00:00:00")q.save()
复制代码


然后查看数据库,可以看到我们通过 save() 操作已经创建了一条数据了。


获取单个数据呢:


q = Question.objects.get(id=1)print(q.question_text)
复制代码


以上就是我们这一篇笔记的全部内容,下一篇笔记将详细介绍如果通过 Django 的 model 对数据进行增删改查的操作。


发布于: 刚刚阅读数: 4
用户头像

Hunter熊

关注

公众号:Hunter后端 2018-09-17 加入

Python后端工程师,欢迎互相沟通交流

评论

发布
暂无评论
Django笔记二之连接数据库、执行migrate数据结构更改操作_Python_Hunter熊_InfoQ写作社区