一、ORM简介
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,简单的说:ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用
二、Django中的ORM
2.1、Django连接MySql
在Django项目的settings.py文件中,配置数据库连接信息
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "你的数据库名称", # 需要自己手动创建数据库 "USER": "数据库用户名", "PASSWORD": "数据库密码", "HOST": "数据库IP", "POST": 3306 } } #django默认使用sqllite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库
import mysqldb pymysql.install_as_MySQLdb()
2.2、快速入门
在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表
基本情况:
- 每个模型都是一个Python类,它是django.db.models.Model的子类。
- 模型的每个属性都代表一个数据库字段。
- 综上所述,Django为您提供了一个自动生成的数据库访问API,,详询官方文档链接。
示例:
from django.db import models class User(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=64)
初始化操作:
#setings文件注册新建的APP INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'host', #新建的 ] #在winds cmd或者Linux shell模式的django项目的manage.py目录下执行: python manage.py makemigrations #根据app下的migrations目录中的记录,检测当前model层代码是否发生变化? python manage.py migrate #把orm代码转换成sql语句去数据库执行
2.3、常用字段及字段参数
- AutoField(int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列)
- IntegerField(一个整数类型,范围在 -2147483648 to 2147483647)
- CharField(字符类型,必须提供max_length参数, max_length表示字符长度)
- DateField(日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例)
- DateTimeField(日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例)
字段参数:null(用于表示某个字段可以为空),unique(如果设置为unique=True 则该字段在此表中必须是唯一的),db_index(如果db_index=True 则代表着为此字段设置数据库索引)
补充时间字段参数:配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库,配置上auto_now=True,每次更新数据记录的时候会更新该字段
2.4、关系字段
ForeignKey(外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方)字段参数:to(设置要关联的表)to_field(设置要关联的表的字段)on_delete(当删除关联表中的数据时,当前表与其关联的行的行为)
例如:usergg = models.ForeignKey("usergg",to_field='uid',on_delete=models.CASCADE) 或者直接usergg = models.ForeignKey("usergg")会默认对应到usergg表的主键
models.CASCADE 删除关联数据,与之关联也删除 models.DO_NOTHING 删除关联数据,引发错误IntegrityError models.PROTECT 删除关联数据,引发错误ProtectedError models.SET_NULL 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) models.SET_DEFAULT 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
2.5、简单的增、删、改、查
from cmdb import models def orm(request): #增加,方式一 models.USER.objects.create(username='xx',pw='xx') #方式二 obj=models.USER(username='xx',pw='xx') obj.save() #查询 r = mode.USER.objects.all() for i in r: print(i.id,i.username,i.pw) #根据条件筛选查询 mode.USER.objects.filter(username="xx" ) #删除 mode.USER.objects.filter(username="xx").delete() # 更新 mode.USER.objects.all() .update(username="x") mode.USER.objects.filter(username="x").update(username="xxx")
简单的筛选条件:
id__gt=1,id__lt=1 #大于、小于 id__gte=1 #大于等于 id__lte=1 #小于等于 id__in=[1,2,3] #id在列表中 id__range=[1,2] # id范围是1到3的 id__startswith="xxx" #判断某个字段的值是否是以某个值开始的,还有endswith exclude(id=1) #不等于 distinct() #去重复 reverse() #倒序 只有前面用order_by才生效 order_by() "-id" #减号从大到小 name__contains="要查的模糊字段" #判断某个字段是否包含了某个数据