一、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 ——大于, gt——大于,gte——大于等于, l t — — 小 于 , lt ——小于, lt——小于,lte——小于等于, $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的使用
- 存在16个库,从0开始递增,0-15个数据库名。自动选择0号数据库,select 1——进入1好数据库
- 一个项目对应一个redis实例,0-15个数据库
- set num 1——设置num:1,GET num——得到1,keys * ——查看全部key,mset key1 value1 key2 value2 ——设置多个值
- mget key1 key2 ——得到多个值,keys num?——问号表示任意一个字符,keys num[0-9]——获得num0到9
- exists key ——判断是否存在,存在返回1,不存在返回0,rename key1 key2——对key进行改名
- expire key 秒数——设置过期时间,TTL key——查看还有几秒过期
- set key value EX 秒数——在创建数据的时候设置过期时间。-1表示永久,-2表示不存在
- persist key——将key设置为永久的。type key ——查看数据类型
- del key——删除key,
- redis-cli keys ‘num*’ | xargs redis-cli del ——用linux的管道符来删除。
- flushall——清除所有数据。append key 数据——将数据加在key之前的数据后面。
- incrby key 数字——加数字,decrby key 数字——减数字。
四、redis的列表
相当于栈,但分为左添加和右添加
基本命令:命令 key value
- lpush li 3 4 5 ——给li列表插入3 4 5 ,lrange li 0 2——显示从第0到第2个数据
- 下标索引取值——LINDEX key 下标值,LPOP key——删除左边的一个。
- 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()