乐平网站设计网站优化的关键词
【十二】Django中如何开启事务
事务是MySQL数据库中得一个重要概念
事务的目的:为了保证多个SQL语句执行成功,执行失败,前后保持一致,保证数据安全
【1】ACID是数据库事务的四个关键特性
-
它代表了原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
-
原子性(Atomicity):
-
事务被视为一个不可分割的原子操作单元。
-
这意味着要么全部操作成功并永久保存,要么全部操作失败并回滚到事务开始前的状态,不存在部分成功或部分失败的情况。
-
-
-
一致性(Consistency):
-
事务在执行前后,数据库都必须保持一致状态。
-
这意味着事务执行前后,数据库中的数据必须满足所有定义的完整性约束,例如列级别的约束、外键关系等。
-
-
隔离性(Isolation):
-
事务之间应该相互隔离,每个事务的执行应该与其他事务的执行相互独立,互不干扰。
-
隔离性确保了多个事务可以并发执行,而不会产生不一致的结果。
-
-
持久性(Durability):
- 一旦事务成功提交后,其所做的修改将永久保存在数据库中,即使发生系统故障或重启,数据也能够恢复到提交后的状态。
- 持久性通过将事务日志写入非易失性存储介质来实现,如硬盘驱动器或固态硬盘。
【2】Django中如何开启事务
# 开启事务from django.db import transactiontry:with transaction.atomic():# SQL1# SQL2# SQL3"""写在同一个with语句的代码块都是属于同一个事务,要么同时成功,要么同时失败"""except Exception as e:print(e) # 记录日志transaction.rollback()
【十三】ORM中常用的字段及参数
AutoField
- int自增列,必须填入参数 primary_key=True。
- 当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
- 一个整数类型
- 范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
BigIntegerField(IntegerField)
- 长整型(有符号的)
- 范围在 -9223372036854775808 ~ 9223372036854775807
CharField
-
字符类型,必须提供max_length参数, max_length表示字符长度。
-
verbox_name 标识字段的注释
EmailField(CharField)
- varchar(254)
DecimalField(Field)
- max_digits,小数总长度
- decimal_places,小数位长度
TextField(Field)
- 文本类型
- 支持大段内容,无字数限制
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = ""
- upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- upload_to = "" 上传文件的保存路径
ImageField(FileField)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = ""
- upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- upload_to = "" 上传文件的保存路径
DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
BooleanField(Field)
- 字段为布尔值
- 数据库里面可以存 0/1
TimeField(DateTimeCheckMixin, Field)
- 时间格式 HH:MM[:ss[.uuuuuu]]
FloatField(Field)
- 浮点型
BinaryField(Field)
- 二进制类型
DateField
- 日期字段
- 日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
- 日期时间字段
- 格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
BigAutoField(AutoField)
- bigint自增列,必须填入参数 primary_key=True
SmallIntegerField(IntegerField):
- 小整数 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整数 0 ~ 32767
BigIntegerField(IntegerField):
- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
【关系字段】
ForeignKey
- 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
- ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
to
- 设置要关联的表
to_field
- 设置要关联的表的字段
related_name
- 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’。
on_delete
- 当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
- 删除关联数据,与之关联也删除
models.DO_NOTHING
- 删除关联数据,引发错误IntegrityError
models.PROTECT
- 删除关联数据,引发错误ProtectedError
models.SET_NULL
- 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
- 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET
- 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
db_constraint
是否在数据库中创建外键约束,默认为True。
OneToOneField(unique):ForeignKey(unqiue=True)
unique
OneToOneField
- 一对一字段。
- 通常一对一字段用来扩展已有字段。(通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联)
to
- 设置要关联的表。
to_field
- 设置要关联的字段。
on_delete
- 当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
【字段参数】
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
Foregin(unique = True) ----> OneToOneField
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
DateField和DateTimeField
auto_now_add
- 配置auto_now_add=True
- 创建数据记录的时候会把当前时间添加到数据库。
auto_now
- 配置上auto_now=True
- 每次更新数据记录的时候会更新该字段。
【支持自定义字段】
# 自定义字段(了解)
自定义char类型字段:
class FixedCharField(models.Field):"""自定义的char类型的字段类"""def __init__(self, max_length, *args, **kwargs):self.max_length = max_lengthsuper(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)def db_type(self, connection):"""限定生成数据库表的字段类型为char,长度为max_length指定的值"""return 'char(%s)' % self.max_length