跳转至

创建数据库和表

您需要高效学习,找工作? 点击咨询 报名实战班

点击查看学员就业情况

后端开发离不开数据库


点击这里,边看视频讲解,边学习以下内容

上次课程,我们演示了一个获取订单信息的http请求到了服务端,请求的 url 地址 是 /sales/orders/, 那么服务端程序需要返回 订单信息,上次课程返回的只是简单的一句话, 演示一下url处理的流程。

真实的系统 就应该返回真实的 订单信息。 那么服务端从哪里获取真实的订单信息呢? 像 订单信息 这些数据通常就是保存在数据库里面的。

后端开发基本都需要操作数据,包括数据的 存储、查询、修改、删除。

通常,这些都是通过数据库来完成的。目前业界最广泛使用的数据库还是:关系型数据库。

关系型数据库系统,常用的开源数据库有 mysql 和 postgresql。

建议大家实际工作中使用的时候,使用上面这两种。

但是上面这些数据库,都需要我们安装数据库服务系统 和 客户端库,比较麻烦,现在我们先使用另一种更简单的 数据库 sqlite

sqlite 没有 独立的数据库服务进程,数据操作被做成库直接供应用程序调用。 Django中可以直接使用,无须先搭建数据服务。

后面大家要使用mysql 等其他数据库 只需修改一些配置就可以了。


创建数据库

项目中数据库的配置在 bysms/settings.py 中,这里

# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

大家可以发现,我们使用命令创建的项目, 缺省就是使用 sqlite。 而且对于的数据库文件,缺省的文件名是 db.sqlite3 , 就在项目的根目录下面


首先我们需要创建数据库,执行如下命令

python manage.py migrate

就会在 项目的根目录下面 生成一个配置文件中指定的数据库文件 db.sqlite3

并且 会在其中创建一些表。

image

我们可以点击下面链接,下载sqlite 数据库工具 sqlitestudio

image

下载后解压即可, 运行该工具, 然后打开上面的 文件 db.sqlite3

可以发现该库中有下面这些表已经创建好了。

image

这些表都是 Django缺省设置中, 需要的一些 基本表。

包括: 用户表 auth_user, 登录会话表 django_session 等等。


什么是 ORM


点击这里,边看视频讲解,边学习以下内容

下图是某个数据库 里面 一张 medicine 表的 格式定义。 描述药品表的格式

image


下图是这张表里面存储的一条条数据

image


请你搜索一下你的大脑,这个 表的格式定义表里面一条条数据 , 它们之间的关系就像什么?

是不是很像我们Python基础教程里面说的.... 再努力想想....

想起来了?






对了,是不是 很像 类定义类的实例 之间的关系?

这个medicine表结构定义,就像定义了 一个medicine类, 定义好了之后,这个medicine表里面的一条条记录对应的就是一个个具体的药品。就是 medicine类的实例。

既然 数据库 表定义和表记录之间的关系 就像 类和实例 之间的关系,Django 就让开发者 通过 类 和 实例的操作 来对应 数据库 表 和记录的操作。

Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。

通常,在Django中

  • 定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类

  • 定义该表中的字段(列), 就是定义该类里面的一些属性

  • 类的方法就是对该表中数据的处理方法,包括 数据的增删改查

这样,开发者对数据库的访问,从原来的使用底层的 sql 语句,变成 面向对象的开发,通过一系列对象的类定义 和方法调用就可以 操作数据库。

这样做:

首先 极大的简化了我们应用中的数据库开发,因为无需使用sql语句操作数据库了, 提高了开发的效率;

其次 屏蔽了 不同的数据库访问的底层细节,基本做到了 开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了。

这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping),下面我们就来看怎样使用。

定义我们的 数据库表

我们开发系统,需要定义我们需要的数据库表。

首先,我们再创建一个名为common的应用目录, 里面存放我们项目需要的一些公共的表的定义。

大家还记得创建应用的命令吗?

对了, 进入项目根目录,执行下面的命令。

python manage.py startapp common 

就会创建一个目录名为 common, 对应 一个名为 common 的app,里面包含了如下自动生成的文件。

common/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py


前面已经说过,Django是通过定义类来定义数据库表的。

所以,我们要定义数据库的表,无需执行sql语句,只需要在app目录下面 定义特殊的类就可以了。

数据库表的定义,一般是放在app目录中的 models.py里面的。

打开 common/models.py,发现里面是空的,因为我们还没有定义我们的业务所需要的表。

我们修改它,加入如下内容

from django.db import models

class Customer(models.Model):
    # 客户名称
    name = models.CharField(max_length=200)

    # 联系电话
    phonenumber = models.CharField(max_length=200)

    # 地址
    address = models.CharField(max_length=200)

这个 Customer 类继承自 django.db.models.Model, 就是用来定义数据库表的。

里面的 name、phonenumber、address 是该表的3个字段。

定义表中的字段 就是定义一些静态属性,这些属性是 django.db.models 里面的各种 Field 对象,对应不同类型的字段。

比如这里的3个字段 都是 CharField 对象,对应 varchar类型的数据库字段。

后面的参数 max_length 指明了该 varchar字段的 最大长度。

Djanog 有很多字段对象类型, 对应不同的类型的数据库字段。

大家可以参考官方文档

创建数据库表

定义好表以后,我们怎么真正去创建数据库表呢?

首先我们需要告诉Django: 我们的 common 应用中 需要你关注, 因为其中包含了 数据库Model的定义。

怎么告诉它? 在项目的配置文件 settings.py 中, INSTALLED_APPS 配置项 加入如下内容

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # 加入下面这行
    'common.apps.CommonConfig',
]

'common.apps.CommonConfig' 告诉 Django , CommonConfig 是 common/apps.py 文件中定义的一个应用配置的类。

是这样的

class CommonConfig(AppConfig):
    name = 'common'

CommonConfig 是 AppConfig的 子类, 就表示这个是应用的配置类。

这里 name = 'common' , name 是用来定义 应用的python模块路径的。 这里就是说 应用 模块路径为 common 。

关于 其他的配置参数, 大家可以参考官方文档

https://docs.djangoproject.com/en/dev/ref/applications/#configurable-attributes


补充

在 INSTALLED_APPS中添加声明, 也可以直接写app的包名,比如

INSTALLED_APPS = [

    # 加入下面这行
    'common',
]

这是老版本的做法。

两者的区别,具体可以参考这个帖子


现在Django知道了我们的 common 应用, 我们可以在项目根目录下执行命令

d:\projects\bysms>python manage.py makemigrations common

得到如下结果

Migrations for 'common':
  common\migrations\0001_initial.py
    - Create model Customer

这个命令,告诉Django , 去看看common这个app里面的models.py ,我们已经修改了数据定义, 你现在去产生相应的更新脚本。

执行一下,会发现在 common\migrations 目录下面出现了0001_initial.py, 这个脚本就是相应要进行的数据库操作代码。

随即,执行如下命令

d:\projects\bysms>python manage.py migrate

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

就真正去数据库创建表了。

用 sqlitestudio 查看数据库,发现创建了一张名为 common_customer的表,如下

image

其中 3 个字段就是我们上面定义的 Customer 类里面的 name、phonenumber、address 属性名。

多出来的 id 字段是该表的主键, 是Django自动帮我们添加的。

这个不需要我们在类中显式的定义。

注意

如果以后我们修改了Models.py 里面的库表的定义,都需要再次运行 python manage.py makemigrations common 和 python manage.py migrate 命令,使数据库同步该修改结果

Django Admin 管理数据


点击这里,边看视频讲解,边学习以下内容

Django提供了一个管理员操作界面可以方便的 添加、修改、删除你定义的 model 表数据。

首先,我们需要创建 一个超级管理员账号。

进入到项目的根目录,执行如下命令,依次输入你要创建的管理员的 登录名、email、密码。

d:\projects\bysms>python manage.py createsuperuser
Username (leave blank to use 'byhy'): byhy
Email address: byhy@163.com
Password:
Password (again):
Superuser created successfully.

注意密码至少8个字符。 这里,我们设置密码为 88888888

然后我们需要修改应用里面的 管理员 配置文件 common/admin.py,注册我们定义的model类。这样Django才会知道

from django.contrib import admin

from .models import Customer

admin.site.register(Customer)

好了,现在就可以访问 http://127.0.0.1/admin/ ,输入刚才注册的用户密码登录。

登录后可以看到如下界面。这里面是目前系统中可以修改的表。

点击我们的定义的Customers表

image


点击下面的 ADD CUSTOMER 按钮来添加一条客户记录

image


在跳出的界面中输入客户信息后,点击SAVE按钮

image


完成上面操作后,我们使用数据库查看工具,就发现数据库中确实有了添加的数据信息。

image


如果你是中文的操作系统,想使用中文的admin界面,应该在配置文件 settings.pyMIDDLEWARE 最后加入如下配置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # admin界面语言本地化
    'django.middleware.locale.LocaleMiddleware',
]


要注意上面的界面 Django 内置的给管理员使用的。只是实现了一些通用的功能,而且界面语言偏英语的。

在实际的工作项目中, 还是需要我们自己开发前端界面给他们使用。

目前为止,我们项目代码,在如下百度网盘中的 bysms_02.zip

百度网盘链接:https://pan.baidu.com/s/1nUyxvq6IYykBNtPUf4Ho6w 提取码:9w2u