zoukankan      html  css  js  c++  java
  • django入门到精通⑦python对mysql,redis,mongodb的基本操作

    django入门到精通⑦python对mysql,redis,mongodb的基本操作

    # 创建项目、app

    (python37_django2) D:pythondjango_imooc_xiaobai>django-admin startproject lession4_orm_one
    
    (python37_django2) D:pythondjango_imooc_xiaobai>cd lession4_orm_one
    
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>python manage.py startapp app

    # 安装驱动

    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>pip install mysqlclient

    # 执行对modoles的改动

    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>python manage.py makemigrations
    Migrations for 'app':
      appmigrations001_initial.py
        - Create model Test

    # 将models中的改动变更到数据库中

    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>python manage.py migrate

    # 去掉表中的配置id,免得每次都需要定义id

    # a.删除已经创建的数据库,并重新创建

    MariaDB [lession4]> drop database lession4;
    MariaDB [(none)]> create database lession4;

    b.根据models中的定义,重新生成表结构

    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>python manage.py makemigrations
    
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>python manage.py migrate

    # 测试基本的增删改查

    python manage.py shell
    
    In [1]: from app.models import User
    
    In [2]: user = User.objects.create(username='tom', age=33, phone=13866666688, email='tom@163.com', info='这家伙很懒')
    
    In [3]: user
    Out[3]: <User: user:tom>
    
    In [4]: user = User(username='xiaoming', age=18, phone=155566668888, email='xiaoming@163.com', info='xiaoming info')
    
    In [5]: user
    Out[5]: <User: user:xiaoming>
    
    In [6]: user.id
    
    
    In [7]: user.age = 18
    
    In [8]: user.save()
    
    In [10]: user.age
    Out[10]: 18

    # 基本的过滤条件查询

    In [54]: User.objects.create(username='lily',age=21,phone=100, email='lily@163.com',info='lily info')
    Out[54]: <User: user:lily>
    
    In [55]: User.objects.create(username='lucy',age=20,phone=101, email='lucy@163.com',info='lucy info')
    Out[55]: <User: user:lucy>
    
    In [56]: User.objects.create(username='hanmeimei',age=22,phone=102, email='hanmeimei@163.com',info='hanmeimei info')
    Out[56]: <User: user:hanmeimei>
    
    In [57]: User.objects.create(username='lilei',age=23,phone=103, email='lilei@163.com',info='lilei info')
    Out[57]: <User: user:lilei>
    
    # id>2 的所有用户
    
    In [58]: User.objects.filter(id__gt=2)
    Out[58]: <QuerySet [<User: user:xiaoqiang>, <User: user:lily>, <User: user:lucy>, <User: user:hanmeimei>, <User: user:lilei>]>
    
    # startswith 用户名以l开头的用户
    
    In [60]: User.objects.filter(username__startswith='l')
    Out[60]: <QuerySet [<User: user:lily>, <User: user:lucy>, <User: user:lilei>]>

    # 将对象转换成成字典

    In [12]: vars
    Out[12]: <function vars>
    
    In [13]: _user = vars(user)
    
    In [14]: _user
    Out[14]:
    {'_state': <django.db.models.base.ModelState at 0x18f687585f8>,
     'id': 3,
     'username': 'xiaoming',
     'age': 18,
     'phone': 155566668888,
     'email': 'xiaoming@163.com',
     'info': 'xiaoming info',
     'create_time': datetime.datetime(2021, 1, 5, 8, 14, 6, 937307, tzinfo=<UTC>),
     'update_time': datetime.datetime(2021, 1, 5, 8, 14, 6, 937307, tzinfo=<UTC>)}

    # 多对多添加用户

    In [1]: from app.models import UserProfile,Diary,Group,User
    
    In [2]: import time
    
    In [3]: user = User.objects.get(id=1)
    
    In [4]: group = Group(name='运营', create_time=time.time())
    
    In [5]: group.save()
    
    In [6]: group.user.add(user)
    
    In [10]: user = User.objects.create(username='xiaoqiang', age=18, phone=13666668888,email='xiaoq@163.com', info='xq info')
    
    In [11]: group.user.add(user)

    # 添加一个开发组,并将id为1的用户加入这个组

    In [19]: group = Group.objects.create(name='开发', create_time=time.time())
    
    In [20]: group.save()
    
    In [21]: vars(group)
    Out[21]:
    {'_state': <django.db.models.base.ModelState at 0x2a873290da0>,
     'id': 3,
     'name': '开发',
     'create_time': 1609850343.7919307}
    
    In [22]: user = User.objects.get(id=1)
    
    In [23]: group.user.add(user)

    # 关联查询

    In [25]: from app.models import User,Diary,UserProfile,Group
    
    In [26]: jack = User.objects.get(pk=1)
    
    In [27]: jack
    Out[27]: <User: user:jack>
    
    In [28]: jack.diary.values('content')
    Out[28]: <QuerySet [{'content': '今天有事晴天'}]>

    # 排除年龄小于20岁的人

    In [46]: users = User.objects.all().exclude(age__lt=20)
    
    In [47]: users
    Out[47]: <QuerySet [<User: user:jack>, <User: user:tom>]>
    
    
    # 找出用户名包括 ha 的用户
    In [48]: users = User.objects.filter(username__contains='ja')
    
    In [49]: users
    Out[49]: <QuerySet [<User: user:jack>]>
    
    # 关联查询
    In [4]: from app.models import User,Diary,UserProfile,Group
    
    In [5]: jack = users[0]
    
    In [6]: jack
    Out[6]: <User: user:jack>
    
    In [9]: groups = jack.group
    
    In [13]: groups.values('name')
    Out[13]: <QuerySet [{'name': '运营'}, {'name': '开发'}]>
    
    
    # 自定义sql获取数据
    In [18]: users = User.objects.raw('select * from app_user')
    
    In [19]: users
    Out[19]: <RawQuerySet: select * from app_user>
    
    In [20]: list(users)
    Out[20]: [<User: user:jack>, <User: user:tom>, <User: user:xiaoqiang>]
    
    
    # 聚合函数
    In [29]: user = User.objects.aggregate(Avg('age'))
    
    In [31]: user
    Out[31]: {'age__avg': 28.0}
    
    
    
    # sqlalchemy 数据库驱动
    
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>pip install sqlalchemy
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>pip install pymysql
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>pip uninstall mysqlclient
    
    
    MariaDB [(none)]> create database sqlalchemy_test;
    
    # 插入数据
    In [5]: from sqlalchemy_test import db_session,User
    
    In [6]: user=User(name="jack002")
    
    In [7]: db_session.add(user)
    
    In [8]: db_session.commit()
    
    In [9]: db_session.close()
    
    
    # 查询
    In [19]: jack = db_session.query(User).filter_by(name='jack001').one()
    
    In [20]: jack.name
    Out[20]: 'jack001'

    redis缓存的使用

    # 安装redis的相关依赖

    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_oneapp>pip install redis
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_oneapp>pip install django-redis
    
    
    settings.py添加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': 200}
                # 'PASSWORD': 'XXX'
            }
        }
    }

    # 要安装redis 5,否则可能不支持过期时间的设置

    windows版本redis下载:https://github.com/tporadowski/redis/releases/download/v5.0.10/Redis-x64-5.0.10.msi
    
    In [1]: from django_redis import get_redis_connection
    
    In [2]: cache = get_redis_connection('default')
    
    In [3]: cache.set('name','jack',30)
    Out[3]: True
    
    In [4]: cache.get('name')
    Out[4]: b'jack'
    
    
    原生redis
    
    In [5]: import redis
    
    In [6]: cache = redis.Redis(host='localhost', port=6379)
    
    In [7]: cache
    Out[7]: Redis<ConnectionPool<Connection<host=localhost,port=6379,db=0>>>
    
    In [8]: cache.get('name')
    
    In [9]: cache.set('name','jack01')
    Out[9]: True
    
    In [10]: cache.get('name')
    Out[10]: b'jack01'
    
    In [11]: value = cache.get('name')
    
    In [12]: type(value)
    Out[12]: bytes
    
    In [13]: import json
    
    In [14]: data = {'age':20}
    
    In [15]: cache.set('name', json.dumps(data))
    Out[15]: True
    
    In [16]: value=cache.get('name')
    
    In [17]: value
    Out[17]: b'{"age": 20}'
    
    In [18]: json.loads(value)
    Out[18]: {'age': 20}
    
    In [19]: value.decode('utf-8')
    Out[19]: '{"age": 20}'
    
    In [20]: json.loads(value.decode('utf-8'))
    Out[20]: {'age': 20}

    在models中包装redis获取用户的方法

    # encoding:utf-8
    
    import json
    from functools import wraps
    from django.db import models
    from django_redis import get_redis_connection
    
    _cache = get_redis_connection('default')
    
    
    def cache(func):
        @wraps(func)
        def wrapper(obj, *args):
            key = args[0]
            value = _cache.get(key)
            if value:
                return json.loads(value)
            rs = func(obj, *args)
            _cache.set(key, json.dumps(rs))
            return rs
        return wrapper
    
    
    class Test(models.Model):
        name = models.IntegerField()
    
    
    class User(models.Model):
        # id = models.IntegerField(primary_key=True)
        username = models.CharField(unique=True, max_length=50, blank=False)
        age = models.SmallIntegerField(default=0)
        phone = models.IntegerField(db_index=True, blank=True, default=0)
        email = models.EmailField(blank=True, default='')
        info = models.TextField()
        create_time = models.DateTimeField(auto_now_add=True)
        update_time = models.DateTimeField(auto_now=True)
    
        # 联合索引
        class Meta:
            index_together = ['username', 'phone']
    
        # 定义返回默认信息
        def __str__(self):
            return 'user:{}'.format(self.username)
    
        @classmethod
        @cache
        def get(cls, id):
            rs = cls.objects.get(id=id)
            return {
                'id': rs.id,
                'username': rs.username,
                'age': rs.age,
                'email': rs.email,
                'info': rs.info,
                'create_time': str(rs.create_time),
                'update_time': str(rs.update_time)
            }
    
    
    class UserProfile(models.Model):
        # id = models.IntegerField(primary_key=True)
        # 一对一关系表
        user = models.OneToOneField(User, blank=True, default='', null=True, on_delete=models.SET_NULL)
        birthday = models.CharField(max_length=100, blank=True, default='')
    
        def __str__(self):
            return 'user:{}, birthday: {}'.format(self.user.username, self.birthday)
    
    
    class Diary(models.Model):
        # 一对多的表关系,人员和日记
        # id = models.IntegerField(primary_key=True)
        user = models.ForeignKey(User, related_name='diary', on_delete=models.SET_NULL, blank=True, null=True)
        content = models.TextField()
        create_time = models.IntegerField()
    
    
    class Group(models.Model):
        # 多对多,一个员工是多方面的能手,可能同时在产品组和开发组,一个组有多个员工
        # id = models.IntegerField(primary_key=True)
        user = models.ManyToManyField(User, related_name='group')
        name = models.CharField(max_length=20)
        create_time = models.IntegerField()

    # 测试

    In [1]: from app.models import User
    
    In [2]: user = User.get(1)
    
    In [3]: user
    Out[3]:
    {'id': 1,
     'username': 'jack007',
     'age': 33,
     'email': 'jack@163.com',
     'info': '这家伙很懒',
     'create_time': '2021-01-05 07:56:23.953842+00:00',
     'update_time': '2021-01-06 01:30:59.049096+00:00'}

    mongodb在django中的使用

    服务端安装包下载地址:https://www.mongodb.com/try/download/community

    # 安装pymongo驱动

    (python37_django2) C:Usersws>pip install pymongo


    命令行简单操作mongodb数据库

    直接运行客户端就可以进入命令行shell

    D:mongodb4.0.22inmongo.exe

    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    > use test
    switched to db test
    > use test_jack
    switched to db test_jack
    > db.user.insert({'name':'jack'})
    WriteResult({ "nInserted" : 1 })
    >
    > db.user.insert({'_id':'fadfjljl341jl', 'name':'xiaoming'})
    WriteResult({ "nInserted" : 1 })
    > db.user.find()
    { "_id" : ObjectId("5ff861ffa08d201119e75650"), "name" : "jack" }
    { "_id" : "fadfjljl341jl", "name" : "xiaoming" }

    ipython环境操作mongodb


    创建操作mongo的models

    app/mongo_models.py
    
    # _*_ coding:utf-8 _*_
    # __author__ == 'jack'
    # __date__ == '2021-01-08 10:03 PM'
    
    from django.conf import settings
    
    conn = settings.MONGOCLIENT['test_mongo']
    
    
    class User(object):
    
        db = conn['user']
    
        @classmethod
        def insert(cls, **params):
            return cls.db.insert(params)
    
        @classmethod
        def get(cls, **params):
            return cls.db.find(params)

    # 通过shell操作
    python manage.py shell

    In [1]: from app.mongo_models import User
    
    In [2]: data = {'_id':'001','name':'jack','age':33}
    
    In [3]: result = User.insert(**data)
    
    In [4]: result
    Out[4]: '001'
    
    In [5]: data = User.get(_id=result)
    
    In [6]: list(data)
    Out[6]: [{'_id': '001', 'name': 'jack', 'age': 33}]
    
    In [14]: User.insert(_id='adfa',name='tom',age=20)
    Out[14]: 'adfa'
    
    In [4]: User.update(id='adfa',name='tom001')
    Out[4]: {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
    
    In [5]: rs = User.get(_id='adfa')
    
    In [6]: rs
    Out[6]: {'_id': 'adfa', 'name': 'tom001', 'age': 20}
    
    In [9]: from bson import ObjectId
    
    In [10]: rs = User.get(name='xiaoming')
    
    In [11]: rs
    Out[11]: {'_id': ObjectId('5ffef06328410c4b4416fb57'), 'name': 'xiaoming', 'age': 30}
    
    In [12]: str(rs.get('_id'))
    Out[12]: '5ffef06328410c4b4416fb57'
    
    In [13]: ObjectId('5ffef06328410c4b4416fb57')
    Out[13]: ObjectId('5ffef06328410c4b4416fb57')
    
    In [14]: import uuid
    
    In [16]: uuid.uuid4()
    Out[16]: UUID('146012fc-f403-429e-b3bf-ba889022ff2e')
    
    In [17]: '{}'.format(uuid.uuid4())
    Out[17]: '4bd5acb4-143b-4ee8-86d1-3203b139831c'
    
    In [18]: import time
    
    In [19]: '{}{}'.format(uuid.uuid4(),time.time())
    Out[19]: 'dca2708f-a015-4a17-b3a1-af08967e407b1610543348.1435869'

    # mongo的表关联
    (python37_django2) D:pythondjango_imooc_xiaobailession4_orm_one>pip install mongoengine


    app/mongo_engine.py

    # _*_ coding:utf-8 _*_
    # __author__ == 'jack'
    # __date__ == '2021-01-13 9:10 PM'
    
    
    from mongoengine import connect, Document
    from mongoengine import StringField, IntField, ReferenceField
    
    connect('test_mongo', host='localhost', port=27017)
    
    
    class Users(Document):
        name = StringField(required=True, max_length=200)
        age = IntField(required=True)
    
    
    class Paper(Document):
        title = StringField(required=True, max_length=200)
        user = ReferenceField(Users)

    # 测试

    In [2]: from app.mongo_engine import Users,Paper
    
    In [3]: user = Users.objects.create(name='jack', age=33)
    
    In [4]: user
    Out[4]: <Users: Users object>
    
    In [5]: user.age
    Out[5]: 33
    
    In [6]: user.id
    Out[6]: ObjectId('5ffef269cf8f5cc391ed4635')
    
    In [7]: paper = Paper(title='test paper',user=user)
    
    In [8]: paper.title
    Out[8]: 'test paper'
    
    In [9]: paper.user.name
    Out[9]: 'jack'
    
    In [13]: paper.save()
    Out[13]: <Paper: Paper object>
    
    In [14]: rs = Paper.objects.filter(title='test paper')
    
    In [15]: rs
    Out[15]: [<Paper: Paper object>]
    
    
    In [16]: rs = Paper.objects.get(title='test paper')
    
    In [17]: rs.user
    Out[17]: <Users: Users object>
  • 相关阅读:
    “指定的SAS安装数据(sid)文件不能用于选定的SAS软件订单
    windows下如何快速优雅的使用python的科学计算库?
    量化分析师的Python日记【第1天:谁来给我讲讲Python?】
    Python的lambda函数与排序
    使用python管理Cisco设备-乾颐堂
    python移除系统多余大文件-乾颐堂
    python算法
    python实现高效率的排列组合算法-乾颐堂
    使用python把图片存入数据库-乾颐堂
    Python将阿拉伯数字转化为中文大写-乾颐堂
  • 原文地址:https://www.cnblogs.com/reblue520/p/14299633.html
Copyright © 2011-2022 走看看