• Django常用字段及参数、事务、数据库查询优化


    常用字段

    注意:

    Django中没有设置对应char类型的字段,但可以支持自己定义。

    自定义对应于数据库的char类型字段:

    from django.db.models import Field

    class RealCharField(Field):
    '''
    自定义的char类型字段
    '''
    def __init__(self,max_length,*args,**kwargs):
    self.max_length = max_length #拦截一个父类的方法,操作完之后,利用super调用父类方法
    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

    class Movie(models.Model):
    textField = RealCharField(max_length=64)

    自定义char字段

    常用字段列举

    复制代码
    AutoField(primary_key=True)  # int自增列,主键字段
    
    CharField(max_length=32)   # 对应数据库中的varchar字段,必须提供max_length参数, max_length表示字符长度
    
    IntegerField()           int
    
    BigIntegerField()         bigint
    
    DecimalField()          decimal
    
    EmailField()           varchart(254)
    
    DateField()         # 年月日
    
    DateTimeField()       # 年月日时分秒
    
    BooleanField(Field)          # 给该字段传布尔值 会对应成  数字0/1
     
    TextField(Field)            # 文本类型
    
    FileField(Field)           # 路径保存在数据库,文件上传到指定目录
         # upload_to = '指定文件路径'
         # 给该FileField字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
    复制代码

    常用字段参数

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

    DateField和DateTimeField字段参数

    auto_now_add  #配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
    
    auto_now    #配置上auto_now=True,每次更新数据记录的时候会更新该字段。

    外键字段参数

    外键类型在ORM中用来表示外键关联关系

    to     #设置要关联的表
    
    to_field     #设置要关联的表的字段

    Choice参数

    如性别,学历,婚否等一些数据能够被你列举完全  你就可以考虑使用choices参数

    复制代码
    class Userinfo(models.Model):
        username = models.CharField(max_length=32)
        gender_choices = (
            (1, '男'),
            (2, '女'),
            (3, '其他'),
        )
        gender = models.IntegerField(choices=gender_choices)
        #该字段还是存数字,还可以存匹配关系之外的数字
    复制代码

    数据库查询优化

    only()与defer()

    only():括号内传字段 得到的结果是一个列表套数据对象,该对象内只含有括号内指定的字段。
    对象点该字段属性是不会走数据库查询的,但是你一旦点了非括号内的字段,也能够拿到数据,但是是重新走的数据库查询

        res = models.Book.objects.only('title') #这些对象内部只有title属性
        for r in res:
            print(r.title)     #不走数据库查询
            print(r.price)     #走数据库查询

    defer():与only相反,括号内传字段 得到的结果是一个列表套数据对象,该对象内没有括号内指定的字段属性,对象点该字段属性会重复走数据库,但是你一旦点了非括号内的字段,就不走数据库查询了。

        res = models.Book.objects.defer('title')  # defer与only互为反关系
        for r in res:
            print(r.title)     #走数据库查询
            print(r.price)     #不走数据库查询

    select_related和prefetch_related

    select_related内部是链表操作,会将关系表全部连接起来拼成一个大表,之后一次性查询出来,把所有数据都封装到一个对象中。
    数据对象再获取任意表中的数据的时候都不需要再走数据库了,因为全部封装成了对象的属性。

    复制代码
        res = models.Book.objects.select_related('publish')
        for r in res:
            print(r.publish.name)
    ''' select_related括号内只能传外键字段,并且不能是多对多字段,只能是一对一和一对多字段 select_related(外键字段1__外键字段2__外键字段3) '''
    复制代码

    prefetch_related内部是子查询,但是给你的感觉是链表操作。

    内部通过子查询将外键关联表中的数据也全部给你封装到对象中,之后对象点当前表或外键关联表中的字段也都不需要走数据库了

    两者优缺点比较:

    select_related链表操作,优势在于只走一次sql查询,耗时耗在连接表的操作

    prefetch_related子查询,走两次sql查询,耗时耗在查询次数

    Django orm开启事务操作

    事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性

    事务的四大特性(ACID):
      原子性:事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
      一致性:事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
      隔离性:指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
      持久性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响

    复制代码
    # django orm 开启事务操作    
    from django.db import transaction
    with transaction.atomic(): #在with代码块中执行的orm语句同属于一个事务 pass #代码块运行结束,事务就结束了
    复制代码

    行级锁以及事务补充

    行级锁
    select * from t1 where id=1 for update;
    models.T1.objects.select_for_update().fitler(id=1) (互斥锁,匹配的行将被锁定,直到事务结束,此处只能给一个人查询) 注:这里应该也属于排他锁吧
    
    死锁
    进程或线程之间相互等待对方释放锁/死锁是指在执行并发计算时,一组进程中的每个进程都在等待包括自身在内的其他进程释放资源的一种现象 事务
    1 全局的,就是settings配置文件配置 https://www.cnblogs.com/clschao/articles/10463267.html @transaction.non_atomic_request全局作用下取消某个函数的事务 2 局部 视图函数 from django.db import transaction @transaction.atomic def index(request): pass orm...sql.. return xxx 上下文逻辑里面加 def index(request): .. with transaction.atomic(): pass orm...sql.. ... return xxx ``` mysql中开启事务:start transaction; sql语句,此时表发生的都是临时(数据)变化 tip:roll back;会话回滚变为原来的样子 commit(事务的持久性)

    MTV与MVC模型

    MTV django 号称是MTV框架

    M:models
    T:templates
    V:views

    MVC

    M:models
    V:views
    C:contronner 控制器(路由分发 urls.py)

    MVC模型是一种使用 Model View Controller( 模型-视图-控制器)设计创建 Web 应用程序的模式。

    Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。
        通常模型对象负责在数据库中存取数据。

    View(视图):是应用程序中处理数据显示的部分。
        通常视图是依据模型数据创建的。

    Controller(控制器):是应用程序中处理用户交互的部分。
        通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

    MTV模型
    FLask用的是MTV的模式
    所谓的MTV ( Model–Template–View ),翻译一下就是模型、模板、视图。
    一般是用户通过浏览器向我们的服务器发起一个请求(request),
    这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

  • 相关阅读:
    在Docker中安装JDK
    在Docker中安装Zookeeper以及集群环境搭建
    Druid连接池加密
    在Docker中安装Nginx
    Docker镜像、容器、仓库的介绍
    记一次 oracle 流复制 传播进程故障
    今天遭遇 cannot restore segment prot after reloc:Permission denied
    记一次由raid换盘引起的message记录
    今晚测试了下微信的摇一摇传图
    遭遇linux 异常掉电后 文件系统只读
  • 原文地址:https://www.cnblogs.com/wddxx/p/13796422.html
Copyright © 2020-2023  润新知