创建数据库和表


后端开发离不开数据库

上次课程,我们演示了一个获取订单信息的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

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

白月黑羽Python3教程

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

白月黑羽Python3教程

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

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

白月黑羽Python3教程

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

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

视频讲解

白月黑羽教Python学习视频 - 创建数据库


什么是 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


现在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的表,如下

白月黑羽Python3教程

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

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

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

注意

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

视频讲解

白月黑羽教Python学习视频 - Django Admin管理数据

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表

白月黑羽Python3教程


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

白月黑羽Python3教程


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

白月黑羽Python3教程


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

白月黑羽Python3教程


要注意上面的界面 Django 内置的给管理员使用的。

在实际的工作项目中, 通常需要我们自己创建前端界面给他们使用。

视频讲解

白月黑羽教Python学习视频 - Django Admin管理数据



目前为止,我们项目代码,点击这里下载


作业和练习

本节课程知识点,难度偏大。需要反复学习操作好多遍。

大家根据教程教程,仔细体会 Django 中 ORM 的概念。

仔细体会 Django migrate 命令的作用。


根据课程内容,先下载安装 sqlitestudio。

然后再一步步操作,migrate 产生数据库文件,创建 Customer 表, migrate 生成数据库数据。

每次数据库数据产生变动后,都用 sqlitestudio 查看一下数据的变化。


扫码分享给朋友,一起学更有动力哦



上一页 下一页