python小知识点

前言:

积累知识没有尽头!


ORM操作:

    在ORM操作数据库的时候应当尽量减少对数据库的查询,在一次查询中把数据都拿到,这样可以大幅提高运行效率

    - only(只查询指定字段)

    - defer(查询不包括指定字段的字段)

    - seleted_related(联合查询关联表)    连表操作,相当于主动做join

    - prefetch_related(两次单表查询)    多次单表操作,先查询想要的数据,然后构造条件,如:id=[1,2,3],再次查询其他表根据id做条件。

-通过ORM写偏原生SQL:

  - extra

    Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))

    Entry.objects.extra(where=['headline=%s'], params=['Lennon'])

    Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])

    Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

- raw

    #执行原生SQL

    models.UserInfo.objects.raw('select * from userinfo')

    #如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名

          models.UserInfo.objects.raw('select id as nid from其他表')

    #为原生SQL设置参数

          models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])

    name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}

    Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)

-原生SQL

    from django.db import connection, connections

    cursor = connection.cursor()  # cursor = connections['default'].cursor()

    cursor.execute("""SELECT * from auth_user where id = %s""", [1])

    row = cursor.fetchone() # fetchall()/fetchmany(..)

PS:选择数据库

      queryset = models.Course.objects.using('default').all()

    示例:

       class Depart(models.Model):5个部门

          title = models.CharField(...)

    class User(models.Model):10个用户

          name = models.CharField(...)    

    email = models.CharField(...)

    dp = models.FK(Depart)

    1.以前的你:11次单表查询

          result = User.objects.all()

    for itemin result:

    print(item.name,item.dp.title)

    2. seleted_related,主动做连表查询(1次链表)

          result = User.objects.all().seleted_related('dp')

    for itemin result:

    print(item.name,item.dp.title)

    问题:如果链表多,性能越来越差。

  3. prefetch_related:2次单表查询

          # select * from user ;

          # 通过python代码获取:dp_id = [1,2]

        # select * from depart where id in dp_id

          result = User.objects.all().prefetch_related('dp')

        for itemin result:

        print(item.name,item.dp.title)

赠送:

  数据量比较大,不会使用FK,允许出现数据冗余。


Django的rest framework组件怎么做到的频率控制呢?

    -访问频率控制原理:

    匿名:

          1.1.1.1:[时间,时间,时间,时间,]

    登录:

          user:[时间,时间,时间,时间,]

    默认将访问记录放在缓存中:redis/memcached

不能做到完全的控制,应当对资源做限制比如需要登陆,再对账户加以辨别,,比如账户需要绑定唯一的标志(手机号等)来防止小号出现


rest framework组件的序列化

    from rest_framework.serializersimport Serializer

    class XX(Serializer):

    pass

    ser =XX(queryset,many=True)# ListSerializer对象

    ser =XX(obj,many=False)# XX对象

    当设定many=False时实际上不是用ListSerializer对象实例化


类的构造函数:

    类的构造函数是 __init__

    但是在实例化的时候在执行 __init__ 之前会先执行 __new__ 函数


git的使用:

    git是一个用于帮助用户实现版本控制的软件。

    常用命令:

        git init    初始化git

        git status    查看当前文件夹的状态。

        git add文件名      对指定文件进行版本控制

        git add .    对指定文件夹下的所有文件及子目录进行版本控制

         git config --global user.name "John Doe"

        git config --global user.email [email protected]

        git commit -m'详细的描述信息'     创建提交记录(版本)

        git log    查看低版本的记录

        git reflog    查看所有版本的记录

        git reset --hard    提交记录(版本号)    回到某个版本

        git checkout    切换分支

        方式一:

          git stash          将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态

        git stash list      查看“某个地方”存储的所有记录

        git stash clear    清空“某个地方”

        git stash pop      将第一个记录从“某个地方”重新拿到工作区(可能有冲突)

        git stash apply    编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)

        git stash drop      编号,删除指定编号的记录

        git stash作用,帮助我们暂时存储已经开发一些功能的代码,继续做其他事情,做完之后,再回来继续开发

        方式二:

        git branch        查看所有分支

        git branch dev    建立名为dev的分支

        git branch bug    建立bug的分支

        git branch -d bug    删除bug分支

        git checkout dev    切换到dev分支

        git merge bug       将bug分支合并到dev分支


    将代码同步到线上

        git remote add origin .........    将连接修改名称

        git push origin dev    提交dev到origin

        git clone https://github.com/WuPeiqi/dbhot.git    从网址下载代码

        git pull origin dev    下载origin代码中的dev

        git fetch origin dev    下载dev

        git merge origin/dev    改:  git rebase origin/dev    建立dev

        git pull origin master   下载master代码

        git fetch origin master

        git merge origin/master

    版本控制

      git tag -a v1.0 -m'版本介绍'        本地创建Tag

        git show v1.0                      查看

      git tags -n查看本地Tag

        git tag -l'v1.4.2.*'              查看本地Tag,模糊匹配

      git tag -d v1.0                    删除Tag

        git push origin :refs/tags/v0.2    更新远程tag

        git checkout v.10                  切换tag

        git fetch origin tag V1.2

          git push origin  --tags    提交指定版本

        git pull origin  --tags    下载指定版本

        git clone -b v1.0  https://github.com/WuPeiqi/dbhot.git    克隆指定版本


redis

    mysql是一个软件,帮助开发者对一台机器的硬盘进行操作。

    redis是一个软件,帮助开发者对一台机器的内存进行操作。redis是单线程单进程的。

关键字:

      缓存,优先去redis中获取,如果没有就是数据库。

安装:

          - redis软件

        - yum install redis

    redis-server /etc/redis.conf

    -

    wget http://download.redis.io/releases/redis-3.0.6.tar.gz

    tar xzf redis-3.0.6.tar.gz

    cd redis-3.0.6

            make

    /src/redis-server redis.conf

    默认端口:6379

        配置文件:

            bind 0.0.0.0

            port 6379

            requirepass dskjfsdf

    - python连接redis的模块

            pip3 install redis

    基本使用:

          a.

    import redis

    # 创建连接

        # conn = redis.Redis(host='47.94.172.250',port=6379,password='luffy1234')

    # conn.set('x1','wanghuaqiang',ex=5)

    # val = conn.get('x1')

    # print(val)

  b.

 #连接池

    使用连接池

    本质,维护一个已经和服务端连接成功的socket。

    以后再次发送数据时,直接获取一个socket,直接send数据。

        # import redis

        # pool = redis.ConnectionPool(host='10.211.55.4', port=6379,password='luffy1234',max_connections=1000)

        # conn = redis.Redis(connection_pool=pool)

    #

    # conn.set('foo', 'Bar')

        连接池注意:连接池只创建一次


Django redis

        特点:

        a. 持久化

            RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。

            AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。

        b. 单进程、单线程

        c. 5大数据类型

        redis={

        k1:'123',  字符串

        k2:[1,2,3,4,4,2,1], 列表

        k3:{1,2,3,4}, 集合

        k4:{name:123,age:666}, 字典

        k5:{('alex',60),('eva-j',80),('rt',70),},有序集合

        }

        使用字典:

        - 基本操作

        - 慎重使用hgetall, 优先使用hscan_iter

          - 计数器

        注意事项:redis操作时,只有第一层value支持:list,dict ....

          使用列表:

            -左右操作    l,r

            -阻塞    b

            -通过yield创建一个生成器完成一点一点获取(通过字典操作的源码来的灵感)

            队列:先进先出

            栈:后进先出

            可以做事务

        应用(django):

        1. 自定义使用redis

          2. 使用第三方组件

        pip3 install django-redis

              配置:

        CACHES = {

                    "default": {

                      "BACKEND": "django_redis.cache.RedisCache",

                      "LOCATION": "redis://127.0.0.1:6379",

                      "OPTIONS": {

                          "CLIENT_CLASS": "django_redis.client.DefaultClient",

                          "CONNECTION_POOL_KWARGS": {"max_connections": 100}

                          # "PASSWORD": "密码",

                      }

        }

        }

              使用:

        import redis

                from django.shortcuts import render,HttpResponse

                from django_redis import get_redis_connection

                def index(request):

                    conn = get_redis_connection("default")

                    return HttpResponse('设置成功')

                def order(request):

                    conn = get_redis_connection("back")

                    return HttpResponse('获取成功')

              高级使用:

        1. 全站缓存    写到settings

                'django.middleware.cache.UpdateCacheMiddleware',

                    # 其他中间件...

                'django.middleware.cache.FetchFromCacheMiddleware',

        2. 单视图    @cache_page(60 * 15)

                from django.views.decorators.cache import cache_page

                    @cache_page(60 * 15)

        3. 局部页面    模板语言的{% load cache %}    

                 {% cache 5000 缓存key %}

                    缓存内容

                {% endcache %}

        补充:rest framework框架访问频率限制推荐放到redis/memecached




你可能感兴趣的:(python小知识点)