zoukankan      html  css  js  c++  java
  • day56 常用字段及参数,数据库查询优化,django.ORM中的事务操作

    字段

    AutoField(Field)(*****)
            - int自增列,必须填入参数 primary_key=True
            - int primary key auto_increment
    
        BigAutoField(AutoField)
            - bigint自增列,必须填入参数 primary_key=True
    
            注:当model中如果没有自增列,则自动会创建一个列名为id的列
            from django.db import models
    
            class UserInfo(models.Model):
                # 自动创建一个列名为id的且为自增的整数列
                username = models.CharField(max_length=32)
    
            class Group(models.Model):
                # 自定义自增列
                nid = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32)
    
        SmallIntegerField(IntegerField):
            - 小整数 -32768 ~ 32767
    
        PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正小整数 0 ~ 32767
        IntegerField(Field)(******)
            - 整数列(有符号的) -2147483648 ~ 2147483647
             - int()
    
        PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正整数 0 ~ 2147483647
    
        BigIntegerField(IntegerField):(*)
            - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
    
        BooleanField(Field)
            - 布尔值类型
            - is_delete = BooleanField()
                    给该字段传值的时候 你只需要传布尔值即可
            但是对应到数据库  它存的是0和1
    
        NullBooleanField(Field):
            - 可以为空的布尔值
    
        CharField(Field)(******)
            - 字符类型   varchar()
            - 必须提供max_length参数, max_length表示字符长度
    
        TextField(Field)
            - 文本类型
            - 用来存大段文本
    
        EmailField(CharField):
            - 字符串类型,Django Admin以及ModelForm中提供验证机制
    
        IPAddressField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
    
        GenericIPAddressField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
            - 参数:
                protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
                unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
    
        URLField(CharField)
            - 字符串类型,Django Admin以及ModelForm中提供验证 URL
    
        SlugField(CharField)
            - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
    
        CommaSeparatedIntegerField(CharField)
            - 字符串类型,格式必须为逗号分割的数字
    
        UUIDField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
    
        FilePathField(Field)
            - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
            - 参数:
                    path,                      文件夹路径
                    match=None,                正则匹配
                    recursive=False,           递归下面的文件夹
                    allow_files=True,          允许文件
                    allow_folders=False,       允许文件夹
    
        FileField(Field)(***)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
    
        ImageField(FileField)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
                width_field=None,   上传图片的高度保存的数据库字段名(字符串)
                height_field=None   上传图片的宽度保存的数据库字段名(字符串)
    
        DateTimeField(DateField)(****)
            - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    
        DateField(DateTimeCheckMixin, Field)(**)
            - 日期格式      YYYY-MM-DD
    
        TimeField(DateTimeCheckMixin, Field)
            - 时间格式      HH:MM[:ss[.uuuuuu]]
    
        DurationField(Field)
            - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
    
        FloatField(Field)
            - 浮点型
    
        DecimalField(Field)(*****)
            - 10进制小数
            - 参数:
                max_digits,小数总长度
                decimal_places,小数位长度
    
        BinaryField(Field)
            - 二进制类型
    
                  
    字段合

    DateField和DateTimeField参数

    auto_now_add
    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
    
    auto_now
    配置上auto_now=True,每次更新数据记录的时候会更新该字段。
        'AutoField': 'integer AUTO_INCREMENT',
        'BigAutoField': 'bigint AUTO_INCREMENT',
        'BinaryField': 'longblob',
        'BooleanField': 'bool',
        'CharField': 'varchar(%(max_length)s)',
        'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
        'DateField': 'date',
        'DateTimeField': 'datetime',
        'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
        'DurationField': 'bigint',
        'FileField': 'varchar(%(max_length)s)',
        'FilePathField': 'varchar(%(max_length)s)',
        'FloatField': 'double precision',
        'IntegerField': 'integer',
        'BigIntegerField': 'bigint',
        'IPAddressField': 'char(15)',
        'GenericIPAddressField': 'char(39)',
        'NullBooleanField': 'bool',
        'OneToOneField': 'integer',
        'PositiveIntegerField': 'integer UNSIGNED',
        'PositiveSmallIntegerField': 'smallint UNSIGNED',
        'SlugField': 'varchar(%(max_length)s)',
        'SmallIntegerField': 'smallint',
        'TextField': 'longtext',
        'TimeField': 'time',
        'UUIDField': 'char(32)',
    ORM字段与MySQL字段对应关系
    class MyChar(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

    字段参数null

    用于表示某个字段可以为空。
    
    unique
    如果设置为unique=True 则该字段在此表中必须是唯一的 。
    
    db_index
    如果db_index=True 则代表着为此字段设置索引。
    
    default
    为该字段设置默认值。

    关系字段

    当你在使用django2.X版本的时候 在建立外键关系时(*****)
        需要你手动添加几个关键点参数
            models.cascade(级联更新)
            db_constraints(约束)
      在1.x版本,默认为True

    foreignkey

    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
    
    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。  

    字段参数

    to
    设置要关联的表
    
    to_field
    设置要关联的表的字段
    
    on_delete
    当删除关联表中的数据时,当前表与其关联的行的行为。
    
    models.CASCADE
    删除关联数据,与之关联也删除
    
    db_constraint
    是否在数据库中创建外键约束,默认为True。
    -------------------------------------------------------------------
    
    (了解)
    models.DO_NOTHING
    删除关联数据,引发错误IntegrityError
    
    
    models.PROTECT
    删除关联数据,引发错误ProtectedError
    
    
    models.SET_NULL
    删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
    
    
    models.SET_DEFAULT
    删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
    
    
    models.SET
    
    删除关联数据,
    a. 与之关联的值设置为指定值,设置:models.SET(值)
    b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

    OneToOneField

    一对一字段。
    
    通常一对一字段用来扩展已有字段。(通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联)  

    字段参数

    to
    设置要关联的表。
    
    to_field
    设置要关联的字段。
    
    on_delete
    当删除关联表中的数据时,当前表与其关联的行的行为。

    测试脚本

    写在test.py文件中

    from django.test import TestCase
    
    # Create your tests here.
    import os
    
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings")
        import django
        django.setup()
        """
        写针对某一个.py文件的测试代码
        """
      
    from app01 import models
    测试文件

     13个方法

    1.all():查询所有结果
    
    2.filter(**kwargs):包含了与所给筛选条件相匹配的对象(过滤)
    
    3.get(**kwargs):返回与所给筛选条件相匹配的对象,返回结果有且只有一个.如果符合筛选条件的对象超过一个或者没有都会抛出错误.
    
    4.exclude(**kwargs):包含了与所给筛选条件不匹配的结果.
    
    5.order_by(*filed):对查询结果排序.默认是升序,加负号就是降序.
    
    6.reverse():对查询结果反向排序.前提条件是在排序的条件下才能进行反向排序.
    
    7.count():返回数据库中匹配查询(QuerySet)的对象数量,对查询结果进行计数
    
    8.first():返回第一条记录.
    
    9.last()返回最后一条记录.
    
    10.exists():如果QuerySet包含数据,就返回True,否则返回Flase.
    
    11.values(*field):返回一个ValueQuerySet ---一个特殊的eQuerySet.运行后得到的并不是一系列mode的实例化对象,而是一个可迭代的列表套字典.
    
    12.values_list():得到的结果是列表套元组.
    
    13.distinct():从返回结果中去除重复记录,前提是一定要有完全重复的数据,才能去重.
    特殊的QuerySet
    values()       返回一个可迭代的字典序列
    
    values_list() 返回一个可迭代的元祖序列
    
    返回具体对象的
    get()
    
    first()
    
    last()
    
    返回布尔值的方法有:
    exists()
    
    返回数字的方法有
    count()

    QuerySet方法

    update()与save()

    相同:两者都是对修改数据的保存操作.
    不同:
    save()是将数据的全部数据保存时在重新全部保存.加大了对数据库的压力.
    update()是针对修改的数据进行针对的更新.效率高,耗时少

    only与defer(数据库查询优化)

    在ORM内所有的语句操作,都是惰性查询,只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的

     这样设计的好处 在于 减轻数据库的压力

    res = models.Book.objects.only('title')
    print(res)
    for i in res:
    print(i.title) 只走一次数据库查询
    print(i.price)
    当你点击一个不是only括号内指定的字段的时候 不会报错 而是会频繁的走数据库查询

     如图:

    defer:

      res = models.Book.objects.defer('title')
        for i in res:   defer会将不是括号内的所有的字段信息 全部查询出来封装对象中
            print(i.title)  一旦你点击了括号内的字段  那么会频繁的走数据库查询
            print(i.price)  点击其他的就不会再走数据库,直接从对象中获取数据

    如图:

    select_releted()与prefetch_related()(联表)

    select_related与prefetch_related
    select_related帮你直接连表操作 查询数据   括号内只能放外键字段
    res = models.Book.objects.all().select_related('publish')
    for r in res:
        print(r.publish.name)
    res = models.Book.objects.all().select_related('publish__xxx__yyy__ttt')
    print(res)
    res = models.Book.objects.all(
    select_delated()

    select_related:会将括号内外键字段所关联的那张表 直接全部拿过来(可以一次性拿多张表)跟当前表拼接操作
    从而降低你跨表查询 数据库的压力

    注意select_related括号只能放外键字段(一对一和一对多)
    res = models.Book.objects.all().select_related('外键字段1__外键字段2__外键字段3__外键字段4')

    
    

    prefetch_related()

    res = models.Book.objects.prefetch_related('publish')
    for r in res:
        print(r.publish.name)
            
    prefetch_related
    不主动连表操作(但是内部给你的感觉像是连表操作了)  
    而是将book表中的publish全部拿出来 在取publish表中将id对应的所有的数据取出 res
    = models.Book.objects.prefetch_related('publish') 括号内有几个外键字段 就会走几次数据库查询操作

    总:

    def select_related(self, *fields)
        性能相关:表之间进行join连表操作,一次性获取关联的数据。
    
        总结:
        1. select_related主要针一对一和多对一关系进行优化。
        2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
    
    def prefetch_related(self, *lookups)
        性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
    
        总结:
        1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
        2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。

    事务

    ACID

    原子性:。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
    
    一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    
    隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    
    持久性:持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
    事务四特性
    from django.db import transaction
        
            with transaction.atomic():
                """数据库操作
                在该代码块中书写的操作 同属于一个事务
                """
                models.Book.objects.create()
                models.Publish.objects.create()
                # 添加书籍和出版社 就是同一个事务 要么一起成功要么一起失败
            print('出了 代码块 事务就结束')

     

  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/komorebi/p/11557571.html
Copyright © 2011-2022 走看看