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 用来记录和追踪执行过那些迁移
改变模型的时候三个步骤:
- 编辑models.py文件,改变模型
- 运行python manage.py makemigrations 为模型的改变生成迁移文件
- 运行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()