一. 配置数据库
1. 安装第三方模块
pip install mysqlclient
2. django连接数据库
在项目中的settings.py中配置
将:
DATABASES = {'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',}}
修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 修改为mysql
'NAME': "dbname", # 数据库名字
"USER": "ROOT", # 用户名
"PASSWORD": "XXX", # 密码
"HOST": "", # ip
"PORT": "" # 端口 }}
二. 数据库的数据类型
类型:
AutoField: 整形
IntegerField: 整形
SmallIntegerField: 小整数
CharField: 字符串
DecimalField: 小数
DateTimeField: 时间
属性:
primary_key=True 主键自增
verbose_name="ID" : 备注
max_digits=10: 数字总长10位
decimal_places=2, # 小数后两位
default=0 # 默认值
约束:
# 约束,只能在另一张表中已存在的id
# 1. 无约束
# depart_id = models.BigIntegerField(verbose_name="部门id")
# 2. 有约束
# -to: 与那张表关联;
# -to_fields: 与表中的那一列关联
# 2.1 django自动:- 写的deport 生成数据列: deport_id
# 3. 如果部门表删除一个部门,那么关联的用户怎么弄?
# 3.1. 级联删除: on_delete=models.CASCADE
deport = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
# 3.2. 置空: null=True,blank=True, 允许为空 ,on_delete=models.SET_NULL: 设置为空
# deport = models.ForeignKey(to="Department", to_fields="id", null=True, blank=True, on_delete=models.SET_NULL)
单选的约束:
# django中做的约束,写性别时,只能写1或2
gender_choices = (
(1, "男"),
(2, "女"),
)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)
示例:
from django.db import models
# Create your models here.
class Department(models.Model):
"""部门表"""
# id = models.BinaryField(primary_key=True, verbose_name="ID")
# id = models.AutoField(primary_key=True, verbose_name="ID")
title = models.CharField(max_length=32, verbose_name="标题")
class UserInfo(models.Model):
"""员工表"""
name = models.CharField(max_length=16, verbose_name="姓名")
password = models.CharField(max_length=64, verbose_name="密码")
age = models.IntegerField(verbose_name="年龄")
account = models.DecimalField(max_digits=10, verbose_name="账户余额", decimal_places=2, default=0)
creat_time = models.DateTimeField(verbose_name="入职时间")
# 约束,只能在另一张表中已存在的id
# depart_id = models.BigIntegerField(verbose_name="部门id") 无约束
# 有约束,如果删除关联表那剩下的表怎么弄?
deport = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE) # 连级删除
# deport = models.ForeignKey(to="Department", to_fields="id", null=True, blank=True, on_delete=models.SET_NULL) # 允许为空
gender_choices = (
(1, "男"),
(2, "女"),
)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)
三. 操作数据库
1. 创建表;删除表;修改表:在models.py中创建数据库类
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
相当于:
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(32),
password varchar(64),
age int)
- 2. 在终端执行命令:注意: APP已提前注册,
在次创建表就新创建类再次执行命令(删除表或删除列:把要删除的表或列注释掉,再次执行下面语句)
python manage.py makemigrations
python manage.py migrate
在表中新增列时,由于已经存在列中可能已有数据,所以新增列必须要指定列对应的数据:
1. 手动输入一个值
2. 新增列时添加默认值
age = models.IntegerField(default=2)
3. 允许为空
data = models.IntegerField(null=True,blank=True)
以后在开发过程中想要对表结构进项调整:
在models.py文件中操作类即可
四. 操作表数据
根据创建的数据库类操作数据(类名.objects.xxx )
- 1. 新增
UserInfo.objects.create(name="lili", password="321", age=18)
- 2. 删除
UserInfo.objects.filter(id=2).delete() # 根据id=3条件删除
Department.objects.all().delete() # 删除整张表所有数据
- 3. 更新数据
UserInfo.objects.all().update(password=999) # 更新所有数据
UserInfo.objects.filter(id=3).update(password=666) # 更新一条数据
- 4. 获取数据 : data_list=[对象,对象,对象] 得到的是QuerySet类型
data_list = UserInfo.objects.all() # 获取所有数据
for obj in data_list:
print(obj.id, obj.name, obj.password, obj.age)
data_list=[对象,]
data_list=UserInfo.objects.filter(id=3) # 获取一个数据,结果还是一个对象
print(data_list)
或直接获取第一行数据对象,不需要再次循环:
row_obj= UserInfo.objects.filter(id=3).first()
print(row_obj.name)
五. 运行
1. 工具连接mysql生成数据库
create database 库名 default charset utf8 collate utf8_general_ci;
2. django 中修改配置文件,连接Mysql
3. django命令生成数据库表
python manage.py makemigrations
python manage.py migrate
六. 查询方法
第一种:
models.PrettyNum.objects.filter(mobile="13400000000",id=12)
第二种:
data_dict={"mobile":"13400000000", "id":123}
models.PrettyNum.objects.filter(**data_dict)
# 数字运算符:
models.PrettyNum.objects.filter(id=12) # 等于12
models.PrettyNum.objects.filter(id__gt=12) # 大于12
models.PrettyNum.objects.filter(id__gte=12) # 大于等于12
models.PrettyNum.objects.filter(id__lt=12) # 小于12
models.PrettyNum.objects.filter(id__lte=12) # 小于等于12
data_dict={"id_lte":12}
models.PrettyNum.objects.filter(**data_dict)
# 字符串运算符:
models.PrettyNum.objects.filter(mobile="13400000000") #等于
models.PrettyNum.objects.filter(mobile__startswith="134") # 以...开头
models.PrettyNum.objects.filter(mobile__endswith="999") # 以...结尾
models.PrettyNum.objects.filter(mobile__contains="999") # 包含
data_dict={"mobile__contains":"999"}
models.PrettyNum.objects.filter(**data_dict)
分页:
que = models.PrettyNum.objects.all()
que = models.PrettyNum.objects.filter(id=1)[0:10]
# 第一页
que = models.PrettyNum.objects.all()[0:10]
# 第二页
que = models.PrettyNum.objects.all()[10:20]
# 第三页
que = models.PrettyNum.objects.all()[20:30]
# 总数,得到的是一个数字
data = models.PrettyNum.objects.all().count()
data = models.PrettyNum.objects.filter(id=5).count()