美文网首页
python小知识点

python小知识点

作者: dymlnet | 来源:发表于2018-06-02 13:18 被阅读0次

    前言:

    积累知识没有尽头!


    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 johndoe@example.com

            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小知识点

          本文链接:https://www.haomeiwen.com/subject/kykrsftx.html