复习:
1.事务的四大特性(ACID)
原子性、一致性、隔离性、持久性
2.相关SQL关键字
- start transaction;
- rollback;
- commit;
- savepoint;
3.相关重要概念
脏读、幻读、不可重复读、MVCC多版本控制...
Django ORM事务操作
django orm提供了至少三种开启事务的方式
方式1.全局开启
在Web应用中,常用的事务处理方式是将每个请求都包裹在一个事务中。这个功能使用起来非常简单,你只需要将它的配置项ATOMIC_REQUESTS设置为True。
它是这样工作的:当有请求过来时,Django会在调用视图方法前开启一个事务。如果请求却正确处理并正确返回了结果,Django就会提交该事务。否则,Django会回滚该事务。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxshop', 'HOST': '127.0.0.1', 'PORT': '3306', 'USER': 'root', 'PASSWORD': '123',"ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程 "AUTOCOMMIT":False, #全局取消自动提交,慎用 }, 'other':{ 'ENGINE': 'django.db.backends.mysql', ...... } # 还可以配置其他数据
方式2: 局部使用事务(装饰器)
@transaction.atomic 加了该装饰器的视图函数默认属于一个事务
from django.db import transaction @transaction.atomic def index():
# 下面的代码在一个事务中执行,一但出现异常,整个函数中所有的数据库操作全部都会回滚
方式3: with上下文管理
with transaction.atomic():
会将with里面的ORM语句作为一个事务
from django.db import transaction def reg(request): with transaction.atomic():
# 下面的代码在一个事务中执行,一但出现异常,整个with函数内部的数据库操作都会回滚
...
ORM常用字段类型
字段 | 功能 |
AutoField() | int类型且自增,必须填入参数 primary_key=True |
CharField() | 主要存储字符串的数据类型 |
IntegerField() | 存储整型数据 |
BigIntegerField() | 大整型,只要用于存储整型的数据 |
DateField() | 主要存储日期类型的数据类型,年月日 |
DateTimeField() | 主要存储日期类型的数据类型,时分秒 |
DecimalField() | 表示固定精度的十进制数的字段。它有两个必须的参数:max_digits:数字允许的最大位数decimal_places:小数的最大位数 |
EmailField() | 邮件格式的数据 |
BooleanField() | 传布尔值存数字0或1 |
TextField() | 存储大段文本 |
FileField() | 存储文件数据 自动找指定位置存储 字段存具体路径 |
ForeignKey() | 外键字段 |
OneToOneField() | 一对一外键字段 |
ManyToManyField() | 多对多外键字段 |
自定义字段
ORM还支持用户自定义字段类型
Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型。
自定义字段在实际项目应用中可能会经常用到,这里需要对他留个印象!
示例:
from django.db import models # Create your models here. #Django中没有对应的char类型字段,但是我们可以自己创建 class FixCharField(models.Field): ''' 自定义的char类型的字段类 ''' 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): ''' 限定生成的数据库表字段类型char,长度为max_length指定的值 :param connection: :return: ''' return 'char(%s)'%self.max_length #应用上面自定义的char类型 class Class(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=32) class_name=FixCharField(max_length=16) gender_choice=((1,'男'),(2,'女'),(3,'保密')) gender=models.SmallIntegerField(choices=gender_choice,default=3)
ORM常用字段参数
字段参数 | 说明 |
max_length | CharField必须要设置该参数,不然会报错 |
verboses_name | 相当于注释 |
auto_now | 修改一次就重新记录一次此次修改的事件 |
auto_now_add | 只有创建的时候记录,以后不会改变 |
null | 用于表示某个字段可以为空。设置方式:null = True |
default | 为该字段的默认值,设置方式:default = ‘默认值’ |
max_digits | 数字允许的最大位数 |
decimal_places | 小数的最大位数 |
unique=True | 用于表示该字段值在此表中必须是唯一的,建立唯一索引,设置方式:unique = True |
db_index=True | 将该字段设置为索引,设置方式:db_index = True |
to | 绑定外键字段对应的表 |
to_field | 指定想要绑定的外键字段 |
related_name | 给外键字段起别名 |
choices
当字段数据的可能性可以完全列举出来的时候,应该考虑使用该参数
class User(models.Model): name = models.CharField(max_length=32) info = MyCharField(max_length=64) # 提前列举好对应关系 gender_choice = ( (1, '男性'), (2, '女性'), (3, '其他'), ) gender = models.IntegerField(choices=gender_choice, null=True) user_obj = User.objects.filter(pk=1).first() user_obj.get_gender_display()
on_delete
参数 | 功能 |
models.CASCADE | 级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除 |
models.SET_NULL | 当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空 |
models.PROTECT | 当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除 |
models.SET_DEFAULT | 当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值 |
models.SET() | 当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数 |
models.DO_NOTHING | 什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似 |
标签:models,max,外键,Django,length,ORM,常用字,True From: https://www.cnblogs.com/chen-ao666/p/16992841.html