python——MySQL、mongodb、redis数据库

一、MySQL数据库

MySQL数据库笔记

二、mongodb数据库

一、mongodb的介绍

  • 非关系型数据库,是文档结构,json(字典加列表),存储大型数据
  • 对sql注入语句攻击免疫。最简单的数据库。
  • mongodb中有多个库,库中有多个集合,每个集合中有多条json数据。

二、mongodb数据库操作

  • 输入mongo进入mongo数据库,端口:27017。
  • show dbs——查看数据库,db——查看当前所在的位置。use 数据库——切换数据库,不存在就创建。
  • 注意:mongodb命令全部是小写,区分大小写,但是MySQL,redis,规范是大写,不区分大小写。
  • 如果创建的库没有数据,则这个数据库的名称是不会显示的。
  • db.createCollection(‘student’)——对当前数据库,创建集合,添加数据。db.dropDatabase()——删除当前数据库
  • show collections——查看所有的集合,db.student.drop()——删除student所有的集合
  • db.student.insert({name:‘一个’,age:18})——插入一个不存在的集合时,会自动创建集合。
  • db.student.find()——查找student集合中的所插入的数据,还有insertOne,或者insertMany
  • db.student.find().pretty()——内容进行分条展示。在find()括号里面加入特定的查找条件,进行特定查找。
  • db.student.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:18}̲})——查找年龄大于18岁的数…gte:18}})——查找年龄大于等于18岁的数据
  • g t — — 大 于 , gt ——大于, gtgte——大于等于, l t — — 小 于 , lt ——小于, ltlte——小于等于, $ne——不等于, $eq——等于
  • 多个条件要用逗号隔开,db.student.find({$or[{},{},{}]})——在大括号中填入自己写的东西。
  • 全文档替换——db.student.update({},{})——前面是查找出来的,后面是修改的内容,把这一条数据全部改为后面的内容。
  • db.student.update({_id:7},{$set:{age:38})——只修改age字段的值。,但是只修改第一个满足条件的数据。
  • db.student.update({_id:7},{$set:{age:38},{multi:true})——更新集合中所有满足条件的数据
  • db.student.remove({})——默认删除所有满足条件的数据。不加数据就是全部删除,但是不会真正释放空间,还要用db.repairDatabase()释放空间
  • db.student.deleteOne({})——删除一条数据,db.student.deleteMany({})——多条数据。

三、python操作mongodb

import pymongo

class MyMongodb:
    def __init__(self,database,collection):
        '''
        :param database: 指定要链接的数据据
        :param collection: 指定集合
        '''
        self.client = pymongo.MongoClient()
        self.db = self.client[database]
        self.col = self.db[collection]

    def istype(self,data,istype1):

        '''

        :param data:传入onlyone
        :param istype1: 传入bool
        :return: none
        '''
        if not isinstance(data,istype1):
            raise TypeError


    def insert(self,data,onlyone = True):
        '''

        :param data: 要插入的数据
        :param onlyone: 是否只插入一条
        :return: none
        '''
        # if not isinstance(onlyone,bool):
        #     raise TypeError
        self.istype(onlyone,bool)
        # if onlyone:
        #     self.col.insert_one(data)
        # else:
        #     self.col.insert_many(data)

        self.col.insert_one(data) if onlyone else self.col.insert_many(data)

    def update(self,data,new_data,onlyone =True):

        '''

        :param data: 传入要修改的数据
        :param new_data: 新的数据
        :param onlyone: 判断是否改一条
        :return: none
        '''

        self.istype(onlyone,bool)

        self.col.update_one(data,{'$set':new_data}) if onlyone else self.col.update_many(data,{'$set':new_data})

    def find(self,query = None,onlyone = True):
        '''

        :param query:默认是查询全部
        :param onlyone: 判断是否只查询一条
        :return: none
        '''
        self.istype(onlyone, bool)
        res = self.col.find_one(query) if onlyone else list(self.col.find(query))

        return res

    def delete(self,data,onlyone = True):
        '''

        :param data:要删除的数据
        :param onlyone: 是否指删除一条
        :return: none
        '''
        self.istype(onlyone, bool)
        self.col.delete_one(data) if onlyone else self.col.delete_many(data)

if __name__=='__main__':
    student = MyMongodb('yige','student')
    student.insert({'name':'sige','age':85})
    # student_list = list(student.find(onlyone=false))
    # print(student_list)
    # student.insert([{'name': 'liangge', 'age': 15},{'name': 'sange', 'age': 16}],onlyone=False)
    student_list = student.find(onlyone=False)
    print(student_list)

三、redis数据库

一、非关系型数据库

  • 大部分的非关系型数据库是以文档形式存储,列表,字典,键值对
  • 不支持SQL语法,读写性能高,灵活的数据模型
  • 存储热点数据,可以并发高速读取。

二、redis基础

  • redis-server:启动redis服务,

  • redis-cli SHUTDOWN:关闭服务

  • 端口:6379——配置文件在/etc/redis/redis.conf中

  • redis-cli -h 127.0.0.1 -p 6379——远程连接redis数据库

  • redis-cli——本地连接,ping——查看是否正常,推荐大写

  • echo hello——输出hello

三、redis的使用

  1. 存在16个库,从0开始递增,0-15个数据库名。自动选择0号数据库,select 1——进入1好数据库
  2. 一个项目对应一个redis实例,0-15个数据库
  3. set num 1——设置num:1,GET num——得到1,keys * ——查看全部key,mset key1 value1 key2 value2 ——设置多个值
  4. mget key1 key2 ——得到多个值,keys num?——问号表示任意一个字符,keys num[0-9]——获得num0到9
  5. exists key ——判断是否存在,存在返回1,不存在返回0,rename key1 key2——对key进行改名
  6. expire key 秒数——设置过期时间,TTL key——查看还有几秒过期
  7. set key value EX 秒数——在创建数据的时候设置过期时间。-1表示永久,-2表示不存在
  8. persist key——将key设置为永久的。type key ——查看数据类型
  9. del key——删除key,
  10. redis-cli keys ‘num*’ | xargs redis-cli del ——用linux的管道符来删除。
  11. flushall——清除所有数据。append key 数据——将数据加在key之前的数据后面。
  12. incrby key 数字——加数字,decrby key 数字——减数字。

四、redis的列表

相当于栈,但分为左添加和右添加

基本命令:命令 key value

  1. lpush li 3 4 5 ——给li列表插入3 4 5 ,lrange li 0 2——显示从第0到第2个数据
  2. 下标索引取值——LINDEX key 下标值,LPOP key——删除左边的一个。
  3. lrem key 2 value——从左边开始删除2个value。如果数字是0,则是把值全部删除

五、哈希数据

hash(散列类型)的键值也是一种字典结构,但字段值只能是字符串,不支持其他类型

  • Hset yige name yige,hset yige age 18——在redis数据库中设置了yige:{name:‘yige’,age:‘18’}
  • Hget yige name——得到name字段值,
  • hmset yige height 180 width 130——设置多个
  • hget yige——得到所有的字段
  • hvals yige——得到所有的字段值
  • hgetall yige——得到所有的字段以及字段值,hexists yige name——判断字段名是否存在
  • hincrby yige height 2——对身高加2

六、集合

集合中的数据是无序的

  • sadd se1 1 2 3 a b ——给se1添加1 2 3 a b,scard se1——统计数据的个数
  • spop se1 2——随机删除se1集合中的两个元素,sismember se1 1——判断1是否在集合se1中
  • smembers se1——获取全部集合的元素,
  • srandmember se1 3——当个数为正数时,随机获取3个不重复的数字,当为负数时,随机获取3个重复数字
  • sinter se1 se2——算这两个的交集,sinterstore se3 se1 se2 ——将结果存储在se3中
  • sunion se1 se2——并集,sdiff se1 se2——算这两个的差集.

有序集合关联了一个有效分数

七、有序集合

  • zadd math 100 yige 90 liangge 80 ——设置分数值,zcard math——查看它对应的分数。
  • zrange math 0 -1 ——默认权重从小到大排序,zrerange math 0 -1——取反排序
  • zrem math wuge——删除wuge,zrangebyscore math 70 90 ——获取指定范围的数据
  • 在90前加(意思是不包含的意思。zrangebyscore math 70 (90 limit 0 2 ——不包含90加分页展示,
  • zcount math 80 100——在这个范围内统计个数,zincrby math 5 yige——给yige的权重加5分
  • zremrangebyrank test 0 2——删除第1到第3个元素。
  • 算交并集与无序集合相同,只是将s变为z的差别。

四、python操作数据库(综合含代码)

一、python操作mongodb数据库

import pymongo

class MyMongodb:
    def __init__(self,database,collection):
        '''
        :param database: 指定要链接的数据据
        :param collection: 指定集合
        '''
        self.client = pymongo.MongoClient()
        self.db = self.client[database]
        self.col = self.db[collection]

    def istype(self,data,istype1):

        '''

        :param data:传入onlyone
        :param istype1: 传入bool
        :return: none
        '''
        if not isinstance(data,istype1):
            raise TypeError


    def insert(self,data,onlyone = True):
        '''

        :param data: 要插入的数据
        :param onlyone: 是否只插入一条
        :return: none
        '''
        # if not isinstance(onlyone,bool):
        #     raise TypeError
        self.istype(onlyone,bool)
        # if onlyone:
        #     self.col.insert_one(data)
        # else:
        #     self.col.insert_many(data)

        self.col.insert_one(data) if onlyone else self.col.insert_many(data)

    def update(self,data,new_data,onlyone =True):

        '''

        :param data: 传入要修改的数据
        :param new_data: 新的数据
        :param onlyone: 判断是否改一条
        :return: none
        '''

        self.istype(onlyone,bool)

        self.col.update_one(data,{'$set':new_data}) if onlyone else self.col.update_many(data,{'$set':new_data})

    def find(self,query = None,onlyone = True):
        '''

        :param query:默认是查询全部
        :param onlyone: 判断是否只查询一条
        :return: none
        '''
        self.istype(onlyone, bool)
        res = self.col.find_one(query) if onlyone else list(self.col.find(query))
        return res

    def delete(self,data,onlyone = True):
        '''

        :param data:要删除的数据
        :param onlyone: 是否指删除一条
        :return: none
        '''
        self.istype(onlyone, bool)
        self.col.delete_one(data) if onlyone else self.col.delete_many(data)

if __name__=='__main__':
    student = MyMongodb('yige','student')
    student.insert({'name':'sige','age':85})
    # student_list = list(student.find(onlyone=false))
    # print(student_list)
    # student.insert([{'name': 'liangge', 'age': 15},{'name': 'sange', 'age': 16}],onlyone=False)
    student_list = student.find(onlyone=False)
    print(student_list)
  • self.col.insert_one(data) if onlyone else self.col.insert_many(data)——注意插入多条数据时要用列表。
  • self.col.update_one(data,{‘KaTeX parse error: Expected 'EOF', got '}' at position 14: set':new_data}̲) if onlyone el…set’:new_data})——更新数据的时候不能全部更新,所有只需传入要更改的字典数据即可。
  • res = self.col.find_one(query) if onlyone else list(self.col.find(query))——打印出数据前要先转为列表,但是只查出一个的话就不需要转列表,并且原本的返回值是字典类型的数据

二、python操作mysql数据库

'''
  python 操作mysql
'''
import pymysql

db_config = {
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'admin',
        'password': 'qwe123',
        'db': 'yige' ,
        'charset': 'utf8'
}

conn = pymysql.connect(**db_config)
cur = conn.cursor()   #获取游标对象
try:
    sql = 'select * from `student`'
    cur.execute(sql)
    print(cur.fetchone())
    print(cur.fetchall())
except Exception as e:
    conn.rollback()
    print(f'异常{e},已取消操作')
else:
    conn.commit()
    print('执行成功')
finally:
    cur.close()
    conn.close()
  • 连接MySQL,IP,端口,用户,密码,数据库,编码方式
  • 获取游标对象,执行语句,记得要加分号。
  • 在MySQL中开启了事务,如果没有提交就不会进行持久化
  • 获取查询到的单条数据——cur.fetchone(),cur.fetchmany(2)——获取两条数据,返回的是元组

三、python操作redis

'''
python操作redis
'''
import redis

redis_config = {
    'host':'127.0.0.1',
    'port':6379,
    'db':0,
    'decode_responses':True #默认返回的是字节类型的数据,我们应该返回的是字符串的数据
}
db = redis.StrictRedis(**redis_config)
db.set('num','1234')
db.lpush('li',1)
db.lrange('li',0,-1)

db.set('test',12,ex=60)
db.keys()

四、登陆操作——redis加MySQL

class User:
    def __init__(self,id,name,age,sex,class_id):
        self.id = id
        self.name =name
        self.age = age
        self.sex =sex
        self.class_id =class_id
    def eat(self):
        print(f'{self.name}在吃饭呢')

if __name__=='__main__':
    student_id = input('请输入学号:')
    name = input('请输入姓名:')
    import pymysql
    import redis
    import random

    redis_config = {
        'host': '127.0.0.1',
        'port': 6379,
        'db': 0,
        'decode_responses': True
    }
    db = redis.StrictRedis(**redis_config)
    db.set(f'{student_id}:verfication',str(random.randint(1000,9999)),ex=60)   #生成验证码
    verficatiin = input("请输入验证码")
    if verficatiin==db.get(f'{student_id}:verfication'):
        print('验证码错误')
        raise Exception
    host_ig = {
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'admin',
        'password': 'qwe123',
        'db': 'yige',
        'charset': 'stf-8',

    }
    conn = pymysql.connect(**host_ig)
    cur = conn.cursor()
    try:
        sql = f'select * FROM `student` where `id`={student_id} and `name`="{name}";'
        cur.execute(sql)
        res = cur.fetchone()
        if res:
            now_student =  User(**res)
        else:
            print('账号密码错误')
            raise Exception
    except Exception as e:
        conn.rollback()
        print("出现异常")
    else:
        conn.commit()
    finally:
        cur.close()
        conn.close()

    if now_student:
        print(f'当前登录的用户是:{now_student.name}')
        now_student.eat()

你可能感兴趣的:(Python遗忘知识点,数据库,mongodb,redis)