骄傲的赛亚人

day5-crm模型、数据库增删改查

ORM

object relational mapping(对象关系映射)

用面向对象的方式,描述数据库,表达数据库,操作数据库,达到不编写sql语句,就可以怼数据库进行增删改查操作

映射关系

 

 

买一台云服务器,在云服务器中安装docker

注意:系统选择ubuntu 或者centos

创建数据库docker命令

端口4002可以更改,不重复就可以

docker run --name ck10_mariadb --restart=always -d -v ck10_mariadb:/var/lib/mysql -e MARIADB_ROOT_PASSWORD=pythonvip -p 4002:3306 -e MARIADB_DATABASE=lemontest mariadb:latest

docker 入门教程 http://testingpai.com/article/1631792673644

 

django配置数据库

安装驱动

mysql,mariadb,django官方推荐的驱动程序mysqlclient

python需要安装mysqlclient

windows环境

在网站https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient下载与python版本对应的mysqlclient本地安装文件,再使用pip命令安装,例如

pip install mysqlclient‑1.4.6‑cp38‑cp38‑win_amd64.whl  # py3.8 64位

mac环境

依赖mysql客户端

$ brew install mysql-client
$ echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
$ source .bash_profile
$ pip install mysqlclient

Linux环境

linux环境下需要对应的依赖,根据环境不同依赖有所不同,下面的只是基本的步骤,不能保证在所有的环境上都有效。

Debian/Ubuntu

$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
$ pip install mysqlclient

Red Hat /CentOS

sudo yum install python3-devel mysql-devel
pip install mysqlclien

django数据库配置

在根目录的setting文件中进行配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎后端
        'NAME': '****',   # 数据库名
        'USER': 'root',  # 数据库账号
        'PASSWORD': '****',  # 数据库密码
        'HOST': '******',  # 数据库地址
        'PORT': '****'  # s数据库端口
    }
}

注意:使用默认的sqlite不用更改配置


 

模型

django中的模型准确且唯一的描述了数据。它包含了存储数据的重要的字段和行为。一般来说,每一个模型都映射一个数据库表

基础

  • 每个模型都是一个python的类,这些类都要继承django.db.models.Model
  • 模型类的每个属性相当于数据库的一个字段
  • 利用这些,Django提供了一个自动生成访问数据库的API

创建模型

设计一张学生表,表结构如下:

id int not null auto_increment primarykey
name varchar(20) not null
age tinyint default null
sex tinyint default null
qq varchar(20) default null unique
phone varchar(20) defautl null unique
c_time datetime not null

根视图一样,模型一般定义在应用目录下的models.py文件下

id可以不用写

 1 class Student(models.Model):  # 必须继承
 2     """
 3     每个字段实例的名称,类属性名称,就是数据库字段的名称
 4     """
 5     name = models.CharField(verbose_name="姓名", max_length=20, help_text="姓名")
 6     age = models.SmallIntegerField("年龄", null=True, blank=True, help_text="年龄")
 7     sex = models.SmallIntegerField("性别", default=1, help_text="性别")
 8     qq = models.CharField("qq号码", max_length=20, null=True, blank=True, unique=True, help_text="qq号码")
 9     phone = models.CharField("手机号码", max_length=20, null=True, blank=True, unique=True, help_text="手机号码")
10     channel = models.ForeignKey('Channel', on_delete=models.SET_NULL, null=True, verbose_name='渠道', help_text='渠道来源',
11                                 related_name='students')
12     c_time = models.DateTimeField("创建时间", auto_now_add=True)
13 
14     def __str__(self):
15         """打印字符串输出的名字"""
16         return self.name
17 
18     class Meta:
19         db_table = "tb_student"  # 设置创建表的表名
20         verbose_name = "学生信息"
21         verbose_name_plural = verbose_name  # django admin中显示模型的说明
22         ordering = ["age"]  # 根据年龄排序从小到大

 字段类型

每个字段由一个字段类的实例表示。每个字段实例的名称,类属性名,就是字段的名称,数据库也会以它为列

 

 

 更多字段类型见官方文档:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#charfield

 字段选项

 每一个字段都会有一个参数,对应数据库中字段的各种属性

常用的字段选项

  • primary_key: 指定是否主键,如果没有指定,django会自动创建主键。
  • unique:如果设置为 True,这个字段必须在整个表中保持值唯一
  • null:如果是 True, Django 将在数据库中存储空值为 NULL。默认为 False
  • blank:如果是 True ,该字段允许为空。默认为 False。如果一个字段有 blank=True,表单验证将允许输入一个空值。如果一个字段有 blank=False,则该字段为必填字段。
  • default:默认值
  • auto_now=True每次修改的时候会自动更新时间
  • auto_add_now=True 创建时自动添加时间

更多字段选项见官方文档:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#charfield

 

激活模型

安装应用:

项目根目录的setting文件中添加如下配置

INSTALLED_APPS = [
    'crm.apps.CrmConfig',  # 安装应用

]

生成迁移记录

python manage.py makemigrations crm

注意:加了crm只对crm生成迁移记录,不加会生成所有的迁移记录

会在应用的migrations目录下生成迁移记录文件,同通过运行makemigrations命令,django会检测你对模型,修改了字段,并把修改的部分存储为一次迁移

数据迁移

django有一个自动执行数据库迁移并同步管理数据库结构的命令:migrate

通过命令sqlmigrate可以看到要迁移的sql

python manage.py sqlmigrate crm 0001

执行后就会输出对应迁移文件要执行的sql

运行命令: 

  python manage.py migrate

第一次迁移时,django会在数据库中创建一个特殊的表django_migrations 用来记录和追踪执行过那些迁移

改变模型的时候三个步骤:

  1. 编辑models.py文件,改变模型
  2. 运行python manage.py makemigrations 为模型的改变生成迁移文件
  3. 运行python manage.py migrate 应用数据库迁移

 


 

数据库增删改查

django会自动化给予一条数据库抽象API,为了方便调试,通过下面的命令进入

python  manage.py shell

这个命令会导入当前项目的django环境。默认的python解释器,没有补全和高亮功能,推荐安装ipython

pip install ipython

增:

from crm.models import Student

from django.db import connections

Student.objects.all() # 查看所有的数据

  返回:<QuerySet []>

connections.queries  # 查看所有执行过的sql语句,返回一个列表

创建数据

  • 第一种方法:

    s = Student(name="tom")

    s.save()  # 保存

  • 第二种方法:

    s2 = Student()

    s2.name="王五"

    s2.save

  • 第三种方法:

    Student.objects.create(name="赵六",age=18)  # 不需要save

    Student.objects.get_or_create(name="tom")  # 获取名字叫tom的数据,如果没有这条数据就创建

查所有的数据

  Student.objects.all()

  返回:<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)]

查第一条数据

  Student.objects.first()

  返回:<Student: Student object (1)>

查主键=1的数据

  Student.objects.get(pk=1)

  返回:<Student: Student object (1)>

条件查询

  Student.objects.filter(name="tom")  # 查询名字等于tom的数据

 

<Student: Student object (1)>不是对象的一个方便的,可用的表示形式。通过去编辑模型,增加一个__str__的方法。

class Student(models.Model):  # 必须继承

    
    def __str__(self):
        """打印字符串输出的名字"""
        return self.name

 

改:

改单个数据:

  s = Student.objects.first()  # 先获取数据

  s.age = 18  # 更改数据

  s.save()  # 保存数据

改多条数据,通过调用update:

  Student.objects.filter(sex=1).update(age=18)  # 将女生的年龄全部改为18岁

删:

在对象上调用delete方法

  s = Student.objects.first()

  s.delete()

 

posted on 2022-06-10 10:34  骄傲的赛亚人  阅读(53)  评论(0编辑  收藏  举报

导航