Django ORM 操作mysql数据库

1、Django ORM操作MySQL数据库
a) 新建MySQL数据库叫db_orm
b)新建一个mysql_orm的项目
c) 在项目的settings下修改DATABASE
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_orm',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': '123456',

}

d) 在settings下修改日志级别
e) 在应用下的__init__.py下将Django底层操作mysql数据库的MySQLdb改成pymysql
f) copy模型类:Emp, Dept, SalGrade
g) 生成迁移文件
h) 迁移数据库后再copy数据

1、列操作:
查询所有列
类.objects.all()
Dept.objects.all()
Dept.values().all()
Dept.values_list().all()
指定列使用values(*fields)和values_list(*fields, flat=False, named=False)
Dept.objects.values('deptNo', 'dname')
Dept.objects.values('deptNo')
Dept.objects.values_list('deptNo', 'dname')
Dept.objects.values_list('deptNo')
Dept.objects.values_list('deptNo', flat=True)
Dept.objects.values_list('deptNo', 'dname', named=True)

去重
MySQL中使用类.values('字段').distinct()
统计员工表中员工的工作种类
Emp.values('job').distinct()

Django ORM操作数据库三剑客:
1、模型实体类:models.Model
2、模型管理器:models.Manager
3、操作数据库的API方法:QuerySet

利用QuerySet查询列:
all()返回QuerySet对象集合, values()返回QuerySet字段集合, values_list()返回QuerySet的元组
部分列 values('deptNo'), values_list(*fields, flat, named=True)


条件比较:
等于、大于、大于等于、小于、小于等于、between .. and..
等于: =号,exact, iexact(不区分大小写)
#查询姓名为Smith的员工信息
Emp.objects.filter(ename__exact='smith')
#查询部门编号为20的员工名称
Emp.objects.values_list('ename', flat=True).filter(dept__deptNo__exact=20)
Emp.objects.values_list('ename', flat=True).filter(dept_id__exact=20)
Emp.objects.values_list('ename', flat=True).filter(dept__exact=20)

大于:gt
#查询 工资 大于 2000员工名称 岗位 工资
Emp.objects.values('ename', 'job', 'sal').filter(sal__gt=2000)

大于等于:gte
小于:lt
#查询工资 小于 3000员工名称 岗位 工资
Emp.objects.values('ename', 'job', 'sal').filter(sal__lt=3000)
小于等于:lte

扫描二维码关注公众号,回复: 5451232 查看本文章

between and : range
#查询工资 2000, 3000员工名称 岗位 工资
Emp.objects.values('ename', 'job', 'sal').filter(sal__range=[2000, 3000])
Emp.objects.values('ename', 'job', 'sal').filter(sal__gte=2000,sal__lte=3000)

逻辑判断且、或、非
且:可以使用多个filter()或者filter(key=value, key=value), 使用Q对象
from django.db.models import Q
filter(Q(key=value) & Q(key=value))
或:from django.db.models import Q, filter(Q(key=value) | Q(key=value))
非:from django.db.models import Q, filter(~Q(key=value))
不包含:exclude(key=value, key=value)


Null判断 isnull()函数
#查询奖金为null的员工信息
Emp.objects.(comm__isnull=True)
Emp.objects.(comm=None)

#查询奖金不为null的员工信息
Emp.objects.(comm__isnull=False)

联合查询 union()
#查询工资大于1500 或 含有佣金的人员姓名
qs1 = Emp.objects.values('ename').filter(sal__gt=1500)
qs2 = Emp.objects.values('ename').filter(comm__isnull=True)
qs1.union(qs2)

懒加载:就是创建QuerySet时,Django并没有查询数据库,而是在使用期间进行查询
这样有利于降低数据库的压力,提高性能。

模糊匹配:
contains():包含,区分字符大小写,类似like ‘%%’
icontains():包含,不区分字符大小写,类似like ‘%%’
startswith():类似like ‘abc%’, 区分字符大小写
istartswith():类似like ‘abc%’, 不区分字符大小写
endswith():类似like ‘% abc’, 区分字符大小写
iendswith():类似like ‘% abc’, 不区分字符大小写

in(list, tuple, queryset),如果是QuerySet类似于子查询

排序 order_by('字段一', ‘-字段二’)
在创建模型是,在元类中指定默认的排序。
class Meta:
db_table = 'emp'
ordering = ['empNo']
contains():包含,区分字符大小写,类似like ‘%%’

日期时间相关的函数
使用日期时间查询时,需构建日期时间对象引入datetime
year、month、day、week_day、hour、minutes、second:对日期间类型的属性进行运算

aggregate()聚合
组函数:from django.db.models import Count, Max, Min, Avg, Sum
返回的都是字段,默认是field__类型
获取数据方法:count()返回数字

annotate()分组,分组时,注意去除默认的ordering,否则只会按照ordering的字段进行分组
# 查询每个部门的平均工资
Emp.objects.values('dept').annotate(avg=Avg('sal'))
# 查询部门平均工资大于2000的部门编号
Emp.objects.values('dept').annotate(avg=Avg('sal')).filter(avg__gt=2000)

数据库的DML操作
增:save()--如果对象的主键存在就更新,不存在就是添加, get_or_create(),create(), bulk_create(objs)
obj, created = get_or_create():现根据field进行查询,如果查询得到多条就会提示错误,如果没有就会添加,如果存在一条就会返回
改:update(),update_or_create()
obj, created = update_or_create()现根据field进行查询,如果查询得到多条就会提示错误,如果没有就会添加,如果存在一条就会修改,添加或者修改时会优先考虑defaults里面的字段,而查询就是kwargs里面的字段查询

删:delete(),注意,如果有外键关联,而且关联级别是:model.CASCADE(级联删除)时,当主表数据进行删除时,子表数据也会删除。

事务控制:
1、导入from django.db import transaction
使用@transaction.atomic修饰器或者with transaction.atomic():
//代码

2、在Settings中数据库的配置中添加
'ATOMIC_REQUESTS': True,然后使用@transaction.non_atomic_requests(using='other')进行控制

猜你喜欢

转载自www.cnblogs.com/Minlwen/p/10488811.html