• Django框架之模型层(二)


    【十二】Django中如何开启事务

    事务是MySQL数据库中得一个重要概念
    事务的目的:为了保证多个SQL语句执行成功,执行失败,前后保持一致,保证数据安全             

    【1】ACID是数据库事务的四个关键特性

    • 它代表了原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

      • 原子性(Atomicity):

        • 事务被视为一个不可分割的原子操作单元。

        • 这意味着要么全部操作成功并永久保存,要么全部操作失败并回滚到事务开始前的状态,不存在部分成功或部分失败的情况。

    • 一致性(Consistency):

      • 事务在执行前后,数据库都必须保持一致状态。

      • 这意味着事务执行前后,数据库中的数据必须满足所有定义的完整性约束,例如列级别的约束、外键关系等。

    • 隔离性(Isolation):

      • 事务之间应该相互隔离,每个事务的执行应该与其他事务的执行相互独立,互不干扰。

      • 隔离性确保了多个事务可以并发执行,而不会产生不一致的结果。

    • 持久性(Durability):

      • 一旦事务成功提交后,其所做的修改将永久保存在数据库中,即使发生系统故障或重启,数据也能够恢复到提交后的状态。
      • 持久性通过将事务日志写入非易失性存储介质来实现,如硬盘驱动器或固态硬盘。

    【2】Django中如何开启事务

    1. # 开启事务
    2. from django.db import transaction
    3. try:
    4. with transaction.atomic():
    5. # SQL1
    6. # SQL2
    7. # SQL3
    8. """写在同一个with语句的代码块都是属于同一个事务,要么同时成功,要么同时失败"""
    9. except Exception as e:
    10. print(e) # 记录日志
    11. 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

    ImageField(FileField)

    • 字符串,路径保存在数据库,文件上传到指定目录
    • 参数:
      • upload_to = ""
        • upload_to = ""      上传文件的保存路径
          storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

    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。
    1. OneToOneField(unique):ForeignKey(unqiue=True)
    2. 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
    • 每次更新数据记录的时候会更新该字段。

    【支持自定义字段】

    1. # 自定义字段(了解)
    2. 自定义char类型字段:
    3. class FixedCharField(models.Field):
    4. """
    5. 自定义的char类型的字段类
    6. """
    7. def __init__(self, max_length, *args, **kwargs):
    8. self.max_length = max_length
    9. super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
    10. def db_type(self, connection):
    11. """
    12. 限定生成数据库表的字段类型为char,长度为max_length指定的值
    13. """
    14. return 'char(%s)' % self.max_length

  • 相关阅读:
    unicode汉字编码转化
    算法中的变形金刚——单纯形算法学习笔记
    【JavaEE初阶】多线程 _ 基础篇 _ 线程的概念和创建
    在RabbitMQ中使用新的MQTT 5.0功能
    Java 设置 httponly cookie
    Java抽象工厂模式之总有你想不到的知识
    idea Transparent-native-to-ascii 是否需要勾选?
    去IC设计公司面试,你需要提前准备好这些
    【Docker】联合探讨Docker:容器化技术的革命性应用
    前端的几种网络请求方式
  • 原文地址:https://blog.csdn.net/m0_71292438/article/details/134464053