django orm mysql_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

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')进行控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值