一. Python對(duì)MySQL的操作
(1) 安裝模塊
pip install pymysql
(2) 操作mysql的八步
(1) 連接MySQL數(shù)據(jù)庫(kù)
db = pymysql.connect("主機(jī)名", "用戶名", "密碼", "數(shù)據(jù)庫(kù)名")
(2) 設(shè)置字符集
db.set_charset("utf8") # 注意為utf8
(3) 創(chuàng)建游標(biāo)對(duì)象
cursor = db.cursor()
(4) 編寫sql語(yǔ)句
sql = "select * from 表名 ~~~~"
(5) 執(zhí)行sql語(yǔ)句
cursor.execute(sql) # 注意:執(zhí)行插入刪除操作要提交事務(wù),調(diào)用db.commit()
(6) 處理結(jié)果集
cursor.fetchall() # 獲取所有數(shù)據(jù)僻肖,返回元組
cursor.fetchone() # 獲取一條數(shù)據(jù)
cursor.fetchmany(size) # 獲取size條
(7) 當(dāng)前sql語(yǔ)句執(zhí)行受影響條目
curosr.rowcount
(8) 關(guān)閉數(shù)據(jù)庫(kù)的連接
db.close()
二. Python對(duì)MongoDB的操作
(1) 安裝模塊
pip install pymongo
(2) 操作MongoDB的五步
(1) 導(dǎo)入pymongo
from pymongo import MongoClient
(2) 連接服務(wù)器 端口號(hào)27017
con = MongoClient("localhost")
con = MongoClient("localhost", port=27017) # 指定端口號(hào)
(3) 選擇數(shù)據(jù)庫(kù)
db = con.數(shù)據(jù)庫(kù)名稱 # 如果數(shù)據(jù)庫(kù)中不存在則會(huì)創(chuàng)建
db = con['數(shù)據(jù)庫(kù)名稱'] # ok 同上
# 獲取集合
collenction = db.集合名
# 例如: db = con.FirstDB 選擇數(shù)據(jù)庫(kù)中的集合 col = db.User
(4) 對(duì)數(shù)據(jù)的CRUD
==============================================
4.1) 插入數(shù)據(jù)
==============================================
db.集合名.insert({文檔}) # 插入一條文檔 返回id
db.集合名.insert([{文檔1}, {文檔2}, ..]) # 插入多條文檔忙厌,傳入的類型必須是列表裤园,以列表的形式返回多個(gè)id
# 3.x以后推薦的方法
db.集合名.insert_one({文檔})
db.集合名.insert_many([{文檔1}, {文檔2}...])
例子:
user1 = {"name":'zs', "age": 18, 'gender': 'w', phone: '123456..'}
user2 = {"name":'ls', "age": 28, 'gender': 'm', phone: '123456..'}
db.集合名.insert(user1)
db.集合名.insert([user1, user2])
db.集合名.insert_one(user2)
db.集合名.insert_many([user1, user2])
==============================================
4.2) 查詢數(shù)據(jù)
==============================================
cursor = db.集合名.find() # 查詢所有, 返回cursor 對(duì)象 可以使用next()方法進(jìn)行取值
db.集合名.find({條件})
db.集合名.find_one() # 查詢一條記錄
db.集合名.find_one({條件}) # 添加過(guò)濾好港,直接返回結(jié)果
# 帶id的查詢
from bson.objectid import ObjectId
res = db.集合名.find({"_id": ObjectId("5a601623.....")})
# 模糊查詢
import re
res = db.集合名.find({"name": '/張/'}) # error 如果這樣寫,查詢的是 /張/ 字符串
res = db.集合名.find({"name": re.compile("張")})
print(res) # ok 查詢包含張的記錄
# sort limit skip count查詢
# sort排序
res = db.集合名.find().sort('age', 1) # 按照年齡升序排序
res = db.集合名.find().sort('age', -1) # 按照年齡降序排序
# limit取值
res = db.集合名.find().sort('age', -1).limit(2)
# skip
db.集合名.find().skip()
# count統(tǒng)計(jì)
db.集合名.find().count()
==============================================
4.3) 修改數(shù)據(jù)
==============================================
db.集合名.update(條件, {"$set":{}}) # 重新賦值
db.集合名.update(條件, {"$inc":{}}) # 在原來(lái)值基礎(chǔ)上增加
例如: res = db.user.update({'age':18},{'$set':{'age':100}})
返回修改的結(jié)果 {'n': 1, 'nModified': 1, 'ok': 1.0,'updatedExisting': True}
# update_one() 修改一條
db.集合名.update_one({'name':'zs'}, {'$set':{'age':10}}) # 返回對(duì)象obj
# update_many() 修改多條
db.collection.update_many({'name':'張三'},{'$set':{'sex':'男'}})
獲取匹配的條數(shù)和修改的條數(shù)(只有3.x以后推薦的形式返回結(jié)果才為對(duì)象)
obj.matched_count # 匹配條數(shù)
obj.modified_count # 修改條數(shù)
==============================================
4.4) remove刪除數(shù)據(jù)
==============================================
# 按條件刪除
db.集合名.remove({條件})
# 刪除全部
db.集合名.remove()
# 刪除匹配的第一條數(shù)據(jù)
db.集合名.delete_one()
# delete_many() 刪除匹配到的數(shù)據(jù)(刪除多條)
db.集合名.delete_many({條件})
# 獲取3.x以后新版本刪除數(shù)據(jù)的條數(shù)
obj.deleted_count
(5) 關(guān)閉數(shù)據(jù)庫(kù)
con.close()
三. Python對(duì)Redis的操作
(1) 安裝模塊
pip install redis
(2) 連接方式
連接redis提供了兩個(gè)類, 其中StrictRedis實(shí)現(xiàn)了大部分官方的方法, 并使用官方的語(yǔ)法和命令;
Redis是StrictRedis的子類, 用于兼容舊版本的redis聋溜。
連接實(shí)例:
res = redis.StrictRedis(host="127.0.0.1", port=6379, password='123', db=0, decode_response=True) # 默認(rèn)選擇0號(hào)數(shù)據(jù)庫(kù), 加上decode_response, 寫入數(shù)據(jù)庫(kù)為字符串類型, 不加寫入數(shù)據(jù)庫(kù)為字節(jié)類型
res = redis.Redis(host="127.0.0.1", port=6379, password='123', db=0, decode_response=True)
(3) 使用連接池連接
管理redis server的所有連接, 避免每次建立連接, 釋放連接的開(kāi)銷, 用于實(shí)現(xiàn)多個(gè)redis實(shí)例共享一個(gè)連接池丸凭。
連接實(shí)例:
pool = redis.ConnectionPool(host="127.0.0.1", port=6379, password='123', db=0, decode_response=True)
re = redis.StrictRedis(connection_pool=pool)
re = redis.Redis(pool)
(4) 數(shù)據(jù)庫(kù)相關(guān)操作
1. re.keys(pattern="*") # 根據(jù)通配符獲取對(duì)應(yīng)的keys
例如:
print(re.keys()) # 默認(rèn)獲取所有name
print(re.keys('h?llo')) # ? 只存在一個(gè)任意字符(不同正則), * 匹配任意個(gè)字符(可有可無(wú))
2. re.delete(*names) # 根據(jù)name刪除redis的任意key
例如:
re.delete('name') # string類型的name
re.delete('myHash') # hash類型
re.delete('myList', 'mySet') # 同時(shí)刪除多個(gè)key
3. re.exists(name) # 根據(jù)key是否存在
例如:
re.exists('mySet') # True
4. re.expire(name, time) # 為某個(gè)key設(shè)置超時(shí)時(shí)間
例如:
re.expire('myzset', 10) # 單位10秒
5. re.rename(src, dst) # 對(duì)某個(gè)key重命名
例如:
re.rename('myHash', 'newMyHash')
6. re.move(name, db) # 將某個(gè)key移動(dòng)到指定的db(0-15)下
例如:
re.move('myHash', 1)
7. re.randomkey() # 隨機(jī)返回一個(gè)key
例如:
print(re.randomkey())
8. re.type(name) # 獲取key對(duì)應(yīng)值的類型
例如:
print(re.type('myhash'))
9. re.flushdb() # 清空數(shù)據(jù)庫(kù)
例如:
re.flushdb()
10. re.flushall() # 清空所有數(shù)據(jù)庫(kù)
例如:
re.flushall()
(5) String字符串相關(guān)操作
1. re.set(name,value,ex=None,px=None,nx=False,xx=False) # 設(shè)置鍵值
參數(shù):
ex:過(guò)期時(shí)間(秒)
px:過(guò)期時(shí)間(毫秒)
nx:如果設(shè)置為True,則只有name不存在時(shí)苹威,set操作才執(zhí)行,類似setnx(name, value)
xx:如果設(shè)置為True, 只有name存在時(shí), 當(dāng)前set操作才執(zhí)行
例如:
re.set('name', 'zhangsan')
2. re.get(key, value) # 獲取值
例如:
re.get('name')
3. re.mset(*args, **kwargs) # 批量設(shè)置值
例如:
re.mset({'name', 'zhangsan', 'age': 18}) # 以字典的形式傳入
re.mset(name='zhangsan', name2='lisi') # 以關(guān)鍵字參數(shù)的形式傳入
4. re.mget(key1, key2,...) # 批量獲取值
例如:
print(re.mget('name', 'age'))
5. re.getset(key, value) # 設(shè)置新值返回原值
例如:
print(re.getset('name', 'wangwu')) # 輸出zhangsan
print(re.get('name')) # 重新打印name的值 wangwu
6. r.getrange(key, start, end) # 獲取子字符串(子序列)
例如:
re.set('name', 'zhangsan')
print(re.getrange('name', 0, 3)) # 輸出zhan
7. re.setrange(key, offset, value) # 對(duì)字符串進(jìn)行覆蓋办悟,根據(jù)指定的偏移量開(kāi)始向后替換, 索引從0開(kāi)始
例如:
re.set('name', 'zhangsan')
re.setrange('name', 5, 'lisi')
print(re.getrange('name')) # zhanglisi
8. re.strlen(key) # 獲取值的長(zhǎng)度
例如:
re.set('name', 'zhangsan')
print(re.strlen('name')) # 8
9. re.incr(key, amount=1) # 值的累加尘奏,amount為累加的值,默認(rèn)為1
例如:
print(re.incr('age', amount=2)) # 如果age不存在病蛉,則執(zhí)行完后age創(chuàng)建并賦值為2
print(re.incr('age')) # 3 自增加1
print(re.incr('age', amount=6)) # 9 炫加,結(jié)果增加6
10. re.append(key, value) # 在值后面追加值瑰煎,返回追加后值的長(zhǎng)度
例如:
re.set('name', 'AAA')
re.append('name', 'BBB')
print(re.get('name')) # AAABBB
(6) Hash操作
1. re.hset(name, key, value) # 在name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在則創(chuàng)建,存在則修改)
例如:
re.hset('myHash', 'name', 'zhangsan')
2. re.hget(name, key) # 在name對(duì)應(yīng)的hash中根據(jù)key獲取value
例如:
print(re.hget('myHash', 'name')) # zhangsan
3. re.hgetall(name) # 獲取name對(duì)應(yīng)的hash的所有鍵和值返回字典
例如:
print(re.getall('myHash'))
4. re.hmset(name, mapping) # 在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì)琢感, mapping:字典
例如:
myDict = {'name':'lisi', 'age': 20, 'gender': 'w'}
re.hmset('myHash', myDict )
5. re.hmget(name, keys, *args) # 在name對(duì)應(yīng)的hash中獲取多個(gè)key對(duì)應(yīng)的值
例如:
mylist = ['name', 'gender']
print(re.hmget('myHash', mylist)) # 傳入列表
print(re.hmget('myHash', 'name', 'age')) # 傳入多個(gè)參數(shù)
6. re.hlen(name) # 獲取hash中鍵值對(duì)的個(gè)數(shù)丢间。其中re.hkeys(name) 獲取hash中所有key。 re.hvals()獲取hash中所有value
例如:
print(re.hlen('myHash'))
print(re.hkeys('myHash'))
print(re.hvals('myHash'))
7. re.hexists(name, key) # 檢查name對(duì)應(yīng)的hash是否存在傳入的key
例如:
print(re.hexists('myHash', 'name')) # True
8. re.hdel(name, *keys) # 刪除指定name對(duì)應(yīng)的key所在的鍵值對(duì)
例如:
re.hdel('myHash', 'name')
9. re.hincrby(name, key, amount=1) # 自增hash中key對(duì)應(yīng)的值驹针,不存在則創(chuàng)建對(duì)應(yīng)key
例如:
print(re.hincrby('myHash', 'age', amount=2)) # 若age不存在則創(chuàng)建并age=2烘挫, 存在則加2
10. re.hincrbyfloat(name, key, amount=1.0) # 自增hash中key對(duì)應(yīng)的值,不存在則創(chuàng)建
例如:
print(re.hincrby('myHash', 'score', amount=98.01)) # 若score不存在則創(chuàng)建并score=98.01柬甥,存在則加98.01
(7) List操作
redis中的List在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)List來(lái)存儲(chǔ)饮六。
1. re.lpush(name, values) # 在name對(duì)應(yīng)的list中添加元素,頭插入
例如:
re.lpush('mylist', 'zhangsan', 18,'w') # 在列表中的順序?yàn)?w 18 zhangsan
2. re.rpush(name, values) # 在name對(duì)應(yīng)的list中添加元素苛蒲,尾插入
例如:
re.rpush('mylist', 'zhangsan', 18,'w') # 在列表中的順序?yàn)?zhangsan 18 w
3. re.lpushx(name, value) # 在list中頭插入卤橄,列表存在時(shí)候才插入
例如:
re.lpushx('mylist', 'zhangsan')
4. re.rpushx(name, value) # 在list中尾插入,列表存在時(shí)候才插入
例如:
re.rpushx('mylist', 'zhangsan')
5. re.llen(name) # 獲取name對(duì)應(yīng)的鍵中的元素個(gè)數(shù)
例如:
print(re.llen('mylist'))
6. re.linsert(name, where, refvalue, value) # 在name對(duì)應(yīng)的列表的某一個(gè)值的前或后插入一個(gè)新值
參數(shù):
where: BEFORE(前)或AFTER(后)
refvalue: 列表內(nèi)的值
例如:
re.linsert('mylist','before', 'zhangsan', '01') # 在張三前插入序號(hào)01
7. re.lset(name, index, value) # 對(duì)list中的某一個(gè)索引位置重新賦值
例如:
re.lset('myset', 0, '02') # 將索引下標(biāo)為0的位置的值修改為02
8. re.lrem(name, count, value) # 刪除name對(duì)應(yīng)的list中的指定元素臂外,count為刪除個(gè)數(shù)
參數(shù):
count: count=0 刪除列表中所有的指定值
count>0 從前到后刪除與值相等的元素
count<0 從后向前刪除與值相等的元素時(shí)
例如:
r.lrem('mylist', 1 ,'02')
9. re.lpop(name) / re.rpop(name) # 移除列表的左側(cè)第一個(gè)元素窟扑,并返回
例如:
print(re.lpop('mylist'))
10. re.lindex(name, index) # 根據(jù)索引獲取列表中的元素
例如:
print(re.lindex('mylist', 1)) # zhangsan
11. re.lrange(name, start, end) # 分片獲取元素
例如:
print(re.lrange('mylist', 0, -1)) # 獲取列表總?cè)績(jī)?nèi)容
12. re.ltrim(name, start, end) # 移除列表中沒(méi)有在該索引范圍內(nèi)的值(裁剪)返回列表
例如:
print(re.ltrim('mylist', 0, 2)) # 包含索引下標(biāo)為2漏健,輸出[02, zhangsan 18]
13. re.rpoplpush(src, dst) # 從一個(gè)列表中最右端取值(并刪除), 添加到另一個(gè)列表的左端
例如:
re.lpush('myList1', 'a')
re.lpush('myList2', 'b')
re.rpoplpush('myList1', 'myList2')
print(r.lrange('mylist2',0,-1)) # a b
(8) Set無(wú)序集合操作
1. re.sadd(name, *values) # 給name對(duì)應(yīng)的集合添加元素
例如:
re.sadd('myset', 'a') # 添加a
re.sadd('myset', 'a', 'b') # 添加多個(gè)值
2. re.smembers(name) # 獲取name對(duì)應(yīng)的集合中的所有成員
例如:
print(re.smembers('myset'))
3. re.scard(name) # 獲取name對(duì)應(yīng)集合中的元素個(gè)數(shù)
例如:
print(re.scard('myset'))
4. re.sdiff(key, *args) # 獲取在第一個(gè)name對(duì)應(yīng)的集合中且不再其他集合中的元素(差集)
例如:
re.sdiff('myset1', 'a', 'b')
re.sdiff('myset2', 'b', 'c')
print(r.sdiff('myset1','myset2')) # 輸出 a
5. re.sinter(key, *args) # 獲取多個(gè)集合的并集
例如:
re.sadd("myset1","a","b")
re.sadd("myset2","b","c")
print(r.sinter('myset1','myset2')) # 輸出 a b c
6. re.sismember(name, value) # 檢查value是否是name對(duì)應(yīng)的集合內(nèi)的元素嚎货,返回bool
例如:
print(sismember('myset','a')) # True
7. re.smove(src, dst, value) # 將某一個(gè)值從一個(gè)集合移動(dòng)到另一個(gè)集合,原集合中的值刪除
例如:
re.sadd('myset','a','b','c')
re.sadd('myset1','a','c','d')
print(r.smove('myset','myset1','b')) # True
print(r.smembers('myset1')) # {'a', 'b', 'd', 'c'} 結(jié)果無(wú)序
8. re.spop(name) # 從集合中最右側(cè)移除一個(gè)元素(隨機(jī)) 并返回
例如:
print(re.spop('a'))
9. re.srandmember(name, number=None) # 從name對(duì)應(yīng)的集合中隨機(jī)返回number個(gè)元素默認(rèn)返回一個(gè)
例如:
print(re.srandmember('myset', 2)) # 隨機(jī)返回兩個(gè)元素以列表形式返回
10. re.srem(name, *values) # 刪除name對(duì)應(yīng)的集合中的某一些值蔫浆,返回刪除的個(gè)數(shù)
例如:
print(re.srem('myset', 'a', 'b'))
11. re.sunion(key, *args) # 獲取多個(gè)name對(duì)應(yīng)的集合的并集
例如:
print(re.sunion("myset", 'myset1'))
12. re.sunionstore(dest, keys, *args) # 獲取多個(gè)name對(duì)應(yīng)集合的并集殖属,并將結(jié)果保存到dest對(duì)應(yīng)的集合中
例如:
re.sadd('myset','a','b','c')
re.sadd('myset1','a','c','d')
print(r.sunionstore('myset2','myset','myset1')) # {'d', 'e', 'b', 'c', 'a'} 返回dest集合中元素的個(gè)數(shù)5
(9) Zset操作
有序集合: 在集合的基礎(chǔ)上,為每個(gè)元素排序,元素排序需要根據(jù)另外一個(gè)值來(lái)進(jìn)行比較(score權(quán)重)。
1. re.zadd(name, \*args, \*\*kwargs) # 在name對(duì)應(yīng)的有序結(jié)合中添加元素
例如:
re.zadd('myzset', 1, 'a', 3, 'c', 2, 'b') # 添加三個(gè)元素
re.zadd('myzset', a=1, b=2) # 以關(guān)鍵字參數(shù)的形式添加元素
2. re.zcard(name) # 獲取有序集合內(nèi)元素的個(gè)數(shù)
例如:
print(re.zcard('myzset'))
3. re.zcount(name, min, max) # 獲取有序集合中score在min和max之間的個(gè)數(shù)包含(min和max)
例如:
print(re.zcount('myzset', 0, 5)) # 3
4. re.zincrby(name, value, amount=1) # 自增有序集合中value對(duì)應(yīng)的分?jǐn)?shù)
例如:
re.zincrby('myzset', 'a', 3) # 將a的權(quán)重值加3
5. re.zrange(name, start, end, desc=False, withscores=False, score_cast_func=float) # 按照索引范圍獲取name對(duì)應(yīng)的有序集合的元素
參數(shù):
start: 索引的開(kāi)始位置
end: 索引的結(jié)束位置
desc: 排序規(guī)則瓦盛,默認(rèn)從小到大排序
withscores: 是否獲取權(quán)重, 默認(rèn)只打印元素
score_cast_func: 對(duì)分?jǐn)?shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換的函數(shù)
例如:
print(re.zrange('myzset', 0, -1))
6. re.zrevrange(name, start, end, desc=False, withscores=False, score_cast_func=float) # 按照索引范圍獲取name對(duì)應(yīng)的有序集合的元素, 集合是從大到小排序的(上一個(gè)方法的逆置)
例如:
print(re.zrange('myzset',0,-1,desc=True,withscores=True)) # 帶權(quán)重的返回按從大到小 [('a', 4.0), ('b', 2.0), ('c', 3.0)]
print(re.zrevrange('myzset',0,-1,withscores=True)) # 同上 按權(quán)重從大到小排序 [('a', 4.0), ('b', 2.0), ('c', 3.0)]
7. re.zrank(name,value) / zrevrank(name, value) # 獲取value值在name對(duì)應(yīng)的有序集合中的排行位置(從0開(kāi)始)
例如:
print(re.zrank("myzset", "a")) # 默認(rèn)從小到大排序
print(re.zrevrank("myzset", "a")) # 從大到小排序(逆置)
8. re.zscore(name,value) # 獲取name對(duì)有序集合中 value對(duì)應(yīng)的權(quán)重
例如:
print(re.zscore('myzset','a'))
9. re.zrem(name,*values) # 刪除name對(duì)應(yīng)的有序集合中的值
例如:
re.zrem('myzset','a','b') # 刪除與a b 匹配的值
10. re.zremrangebyrank(name,min,max) # 根據(jù)排行范圍刪除
例如:
re.zadd('myzset', 1, 'a', 3, 'c', 2, 'b') # 添加三個(gè)元素
print(re.zremrangebyrank('myzset',0,1)) # 將排行0-1的刪除
print(re.zrange('myzset',0,-1)) # ['c']
11. re.zremrangebyscore(name,min,max) # 根據(jù)權(quán)重范圍刪除
例如:
re.zadd('myzset', 1, 'a', 3, 'c', 2, 'b') # 添加三個(gè)元素
print(re.zremrangebyscore('myzset',0,1)) # 權(quán)重為0-1的刪除
print(re.zrange('myzset',0,-1)) # ['b', 'c']
12. re.zinterstore(dest,keys,arrregate=None)
獲取兩個(gè)有序集合的交集并放入dest集合洗显,如果遇到相同值不同權(quán)重,則按照aggregate(SUM / MIN / MAX)進(jìn)行操作原环。
默認(rèn)使用的參數(shù) SUM 挠唆,可以將成員的 score 值之 和 作為結(jié)果集中該成員的 score 值;使用參數(shù) MIN 嘱吗,可以將成員的 最小 score 值作為結(jié)果集中該成員的 score 值玄组;而參數(shù) MAX 則是將成員的 最大 score 值作為結(jié)果集中該成員的 score 值。
例如:
re.zinterstore("dest_myzset",("myzset1","myzset2"),aggregate="MAX") # 獲取并集
print(r.zrange('myzset2',0,-1))
13. re.zunionstore(dest,keys,arrregate=None) # 獲取兩個(gè)有序集合的并集并放入dest集合柜与,其他同zinterstore
例如:
print(r.zunionstore('myzset2',('myzset','myzset1'),aggregate='MAX'))
print(r.zrange('myzset2',0,-1))