Django ORM基本用法
一、ORM介绍
1.ORM的概念:
"对象-关系映射"(Object/Relational Mapping) 的缩写。ORM 把数据库映射成对象,然后通过实例对象完成对关系型数据库的操作,如下图。
2.ORM的特点
ORM 使用了对象进行数据库操作,开发者无需了解 sql 语法,只要面向对象编程即可,直接与数据交互,不用关心底层数据库。
3.ORM 的优点
1)实现了面向对象编程,无需面向数据库编码。
- 对数据库的操作(如:增、删、改、查)转化成 类属性和方法
- 不用编写各种 sql 语句
2)实现了数据模型与数据库解耦,消除了不同数据库编码之间的差异。
- 不用关心数据库是 mysql、Oracle、mssql等
- 只要更改相关配置,就能完成不同数据库间的迁移
4.ORM 的缺点
1)对比直接使用 sql 语句查询,性能有损失。
2)ORM 库不是一个轻量级库,学习成本高。
3)相对于较复杂的 sql 语句,使用 ORM 来操作很复杂,导致代码可读性降低。
二、ORM 使用
1.配置数据库
1)修改 Django 项目 setting.py ,找到 DATABASES 配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'work', # 数据库名称 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root', # 数据库用户名 'PASSWORD': '123456', # 数据库密码 } }
2)修改 setting.py 同级目录下的 __init__.py 文件,增加如下代码。
import pymysql pymysql.version_info = (1,3,13,'final',0) # 一定要加上这句代码 pymysql.install_as_MySQLdb()
pymysql.version_info = (1,3,13,'final',0) 指定版本信息,不然后续会报如下错误 mysqlclient 1.3.13 or newer is required; you have 0.9.3
2.数据模型
1)定义 app 中的 models:例如修改 core/models.py
from django.db import models # Create your models here. class department_temp(models.Model): id = models.AutoField(primary_key=True) jobnum = models.CharField(max_length=100) department = models.CharField(max_length=100) jirakey = models.CharField(max_length=100) name = models.CharField(max_length=100) class Meta: # 必须要写这个类 db_table = 'department_temp' # 指定表名
- 以类名 department_temp 对应数据库表名,继承了models.Model 类。jobnum 对应 字段 jobnum,数据类型 CharField 对应 varchar,max_length 限定长度。
- class Meta 是一个元类,通过 db_table 指定表名
2)基本操作
from core.models import department_temp # 增加一条数据 test = department_temp(jobnum = '00000001',department = 'test',jirakey = '02930213',name = 'test') test.save()
from core.models import department_temp # 删除 test = department_temp.objects.get(jobnum = '00000001') test.delete() # 另外一种方式 # department_temp.objects.filter(jobnum = '00000001').delete() # 删除所有的列 # department_temp.objects.all().delete()
from core.models import department_temp # 修改其中一个字段,再save,相当于SQL中的UPDATE test = department_temp.objects.get(jobnum = '00000001') test.name = '亚瑟' test.save() # 另外一种方式 # department_temp.objects.filter(jobnum = '00000001').update(name='李白') # 修改所有的列 # department_temp.objects.all().update(name='李白')
from core.models import department_temp # 获取单个对象 test =department_temp.objects.get(jobnum = '00000001') print(test.name) # filter相当于SQL中的WHERE,可设置条件过滤结果,返回一个或多个实例对象组成的QuerySets查询集 # test = department_temp.objects.filter(jobnum = '00000001')[0] # 数据排序,返回QuerySets查询集 # test = department_temp.objects.order_by('id')[0] # 限制返回的数据 相当于 SQL 中的 LIMIT 0,2;返回QuerySets查询集 # test = department_temp.objects.order_by('id')[0:2] # 可以组合使用查询条件,返回QuerySets查询集 # test = department_temp.objects.filter(jobnum = '00000001').order_by('id') # 查询所有,返回QuerySets查询集 # test = department_temp.objects.all()
3)进阶操作
# test = department_temp.objects.filter(name='亚瑟').count() # 获取个数 # 大于,小于 # test = department_temp.objects.filter(id__gt=1) # 获取id大于1的值 # test = department_temp.objects.filter(id__gte=1) # 获取id大于等于1的值 # test = department_temp.objects.filter(id__lt=10) # 获取id小于10的值 # test = department_temp.objects.filter(id__lte=10) # 获取id小于10的值 # test = department_temp.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in # test = department_temp.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 # test = department_temp.objects.exclude(id__in=[11, 22, 33]) # not in # isnull # test = department_temp.objects.filter(jobnum__isnull=True) # contains # test = department_temp.objects.filter(name__contains="test") # test = department_temp.objects.filter(name__icontains="test") # icontains大小写不敏感 # test = department_temp.objects.exclude(name__icontains="test") # range # test = department_temp.objects.filter(id__range=[1, 2]) # 范围bettwen and # order by # test = department_temp.objects.filter(name='亚瑟').order_by('id') # asc # test = department_temp.objects.filter(name='亚瑟').order_by('-id') # desc # group by # 实现这句包含group by 的 sql: SELECT department, COUNT(id) FROM department_temp GROUP BY department # from django.db.models import Count, Min, Max, Sum # test = department_temp.objects.values('department').annotate(Count('id')) # limit 、offset # test = department_temp.objects.all()[10:20]
三、APP连接多个数据库
网上资料比较多的是多个APP对应多个数据库,单个APP连接多个数据库的资料比较少。下面介绍一种最简单的方法:
1. settings.py 配置多个数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'work', # 数据库名称 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root', # 数据库用户名 'PASSWORD': '123456', # 数据库密码 }, 'db1': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'test', # 数据库名称 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root', # 数据库用户名 'PASSWORD': '123456', # 数据库密码 } }
2.调用时使用using指定数据库,如果不指定数据库,默认使用 default
models.order.objects.using('db1').get(orderGuid='004afa44-7c7d-4f27-96eb-7063daba40a8').id models.order.objects.using('db1').get(orderGuid='004afa44-7c7d-4f27-96eb-7063daba40a8').orderNumber