文章目录
ORM事务操作
引入事务
python
1.事务的四大特性
原子性、一致性、隔离性、持久性
2.相关SQL关键字
start transaction;
rollback;
commit;
savapoint;
3.相关重要概念
脏读、幻读、不可重复读、MVCC多版本控制
Django ORM提供了至少三种开启事务的方式
开启事务
python
from django.db import transaction
try:
with transaction.atomic():
# SQL1
# SQL2
# SQL3
"""写在同一个with语句的代码块都是属于同一个事务,要么同时成功,要么同时失败"""
except Exception as e:
print(e) # 记录日志
transaction.rollback()
常见的字段类型和参数
python
1.AutoField(primary_key) # 字段才用,可以让它自动创建
2.CharField(max_length) # 对应varchar字段,存储有限的字符
3.IntegerField # 整型
4.BigIntergerField #整型(比如手机号11位)
5.DecimalField(max_digits,decimal_places) # 小数字段
6.DateField(auto_now,aoto_now_add) # 日期(年月日)
7.DateTimeField(auto_now auto_now_add) #日期(年月日时分秒)
8.Booleanfiels:传布尔值自动存0(False)或者1(True)
9.TextField:存储大段文本
10.EmailField:存储邮箱格式数据
11.FileField:传文件对象,自动保存到提前配置好的路径下并存储该路径信息
12.ForeignKeyField(to='',on_delete) 实际外键字段,建立一对一关系
13.OneToOneField(to='',on_delete) 实际外键字段,建立一对多关系
14.ManyToManyField(to='') 虚拟外键字段,建立多对多关系
需要说明的是,这些orm字段并非和sql字段一一对应,有些是封装了一些逻辑功能在字段的创建、存储过程中的。
ORM还支持用户自定义字段类型
python
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length=max_length
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self,connection):
return 'char(%s)' % self.max_length
class User(models.Model):
name=models.CharField(max_length=32)
info=MyCharField(max_length=64)
ORM常用字段参数
python
1.primary_key 主键字段
2.verbose_name 字段注释
3.max_length 字段长度
4.max_digits 小数总共多少位
5.decimal_places 小数点后面的位数
6.auto_now 每次操作数据自动更新事件
7.auto_now_add 首次创建自动更新事件后续不自动更新
在时间相关字段的独有参数,设置为True则会自动执行相关功能。
8.null 允许字段为空
9.default 字段默认值
10.unique 唯一值
11.db_index 给字段添加索引
12.choices 当某个字段的可能性能够被列举完全的情况下使用
13.to/to_field/on_delete
eg:性别、学历、工作状态...
class User(models.Model):
name=models.CharField(max_length=32)
info= MyCharField(max_length=64)
# 提前列举好对应关系
gender_choice=(
(1,'男性'),
(2,'女性'),
(3,'其他'),
)
gender = models.IntergerField(choices=gender_choice,null=True)
user_obj = User.objects.filter(pk=1).first() # 拿到一个对象
user_obj.gender # 直接点显示存储的真实数据
user_obj.get_gender_display() # 通过这个方法拿显示转义后的选项
外键相关参数
python
to 关联表
to_field 关联字段(不写默认关联数据主键)
on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。(只针对一对多和一对一关系)
on_delete()里面相关参数
1、models.CASCADE
级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
2、models.SET_NULL
当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
3、models.PROTECT
当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
4、models.SET_DEFAULT
当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
5、models.SET()
当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
6、models.DO_NOTHING
什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似
ps:主表一般是指在一对一、一对多中一的那一方,当对其进行删除时,另外一张表的所有元素都应该受到影响