Python操作數據庫(mysql redis)
一、python操作mysql數據庫:
數據庫信息:(例如211.149.218.16 szz 123456)
操作mysql用pymysql模塊
#操作其他數據庫,就安裝相應的模塊
import pymysql
ip=’211.149.218.16’
port=3306
passwd=’123456’
user=’root’
db=’szz’
conn=pymysql.connect(host=ip,user=user,port=port,passwd=passwd,db=db,charset=’utf8’) #創建一個數據庫連接
cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #在連接上創建一個遊標,通過遊標去操作數據庫;括號裏指定遊標的類型為字典(指定為字典,方便取值),不指定默認為元組
sql=’insert into nhy(id,name,sex) VALUE (1,’hn’,’nv’);’ #寫sql語句
sql2=’select * from nhy;’
cur.execute(sql) #執行sql語句
cur.execute(sql2)
row_1 = cur.fetchone() #獲取查詢結果的第一條數據,返回的是一個元組,每執行一次就獲取一行
row_2 = cur.fetchmany(3) # 獲取前n行數據,此時遊標在n條數據後面
row_3 = cur.fetchall() # 獲取所有數據,此時遊標在最後面
PS:(
fetchall和fetchone的區別:
如果select本身取的時候有多條數據時:
cursor.fetchone():將只取最上面的第一條結果,返回單個元組如(‘id‘ ,‘title‘), 然後多次使用cursor.fetchone(),依次取得下一條結果,直到為空。
cursor.fetchall() :將返回所有結果,返回二維元組,如((‘id‘,‘title‘),(‘id‘,‘title‘)),
如果select本身取的時候只有一條數據時:
cursor.fetchone():將只返回一條結果,返回單個元組如(‘id‘,‘title‘)。
cursor.fetchall() :也將返回所有結果,返回二維元組,如((‘id‘,‘title‘),),
)
cur.scroll(n,mode=’absolute’) #移動遊標,mode=absolute或relative, absolute指把遊標移到數據的第n行,relative的意思是把遊標移動到當前遊標所在行+n行的位置
cur.scroll(0,mode=’absolute’) #把遊標移動到最前面,不管遊標在哪
conn.commit() #ddl(insert delete update)dcl dml語句必須提交才生效,不然無法保存新建或者修改的數據
cur.close() #關閉遊標
conn.close() #關閉數據庫連接
======eg:寫操作mysql的函數:
import pymysql
def OperationDb(host,user,passwd,port,db,sql,charset=‘utf8‘): #傳參
pymysql.connect(host=host,user=user,passwd=passwd ,port=port,db=db,charset=charset) #建立連接
cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #建立遊標
cur.execute(sql) #執行sql語句
if sql.startswith(‘select‘): #判斷字符串是不是以什麽開頭
res=cur.fetchall() #判斷如果是select語句,直接返回出執行結果,不用commit了
else:
conn.commit() #如果是insert delete update等語句,則需要提交
res=00 #如果不是select語句,返回00
cur.close()
conn.close()
return res
ss=OperationDb(
host=‘211.149.147.233‘,user=‘byz‘,passwd=‘123456‘,db=‘byz‘,sql=‘insert into hn(id,name,sex) VALUE(08,"houning","female") ;‘
) #外面用單引號,sql語句裏面要用雙引號;#調用這個函數,並傳參,把這個函數的值賦給ss
print(ss) #打印出ss,即函數體裏的res
操作redis:
redis是一個nosql類型的數據庫(安裝Redis Desktop Manager ),裏面存的是鍵值對,鍵值對數據都存在內存中,有很快的讀寫速度;python操作redis需要使用redis模塊,pip安裝即可。
#======下面是操作字符串類型的,key都是string類型
import redis
r = redis.Redis(host=‘127.0.0.1‘,port=6379,db=0,password=’123456’) #指定連接redis的ip、端口號以及哪個數據庫、密碼
r.set(‘name‘, ‘houning‘) #設置key和value;name是字段,houning是值;如果name的值已存在,這樣寫就會把原來的值替換掉;
r.setnx(‘name2‘, ‘value‘) #設置的name的值,如果name不存在的時候才會設置
r.setex(‘name3‘, ‘value‘, 30) #設置的name的值,和失效時間,過了30秒後,name3這個key就會自動失效(因為數據都是存在內存當中的,要釋放);比如登錄一個網頁,10分鐘後,就需要重新登錄,這裏就用到了redis的失效時間
r.mset(k1=‘v1‘,k2=‘v2‘) #批量設置多個值,不能設置失效時間
n=r.get(‘name‘) #獲取name的值,redis裏面獲取到的都是bytes類型;
print(n.decode()) # redis裏存進去的都是字符串,但獲取出來的是bytes類型;decode方法是把bytes類型的結果轉換成string類型的
print(json.loads(n.decode())) #把字符串類型再轉換成字典或list類型的
print(r.mget(‘k1‘,‘k2‘)) #批量獲取key
r.delete(‘name‘) #刪除值
r.delete(‘k1‘,‘k2‘) #批量刪除
print(r.keys()) #獲取所有的key
#======下面是操作哈希類型的key
import redis
r = redis.Redis(host=‘127.0.0.1‘,port=6379,db=0,password=’123456’) #指定連接redis的ip、端口號以及哪個數據庫、密碼
r.hset(‘hname‘, ‘hn‘, ‘123456‘) #設置哈希類型hname的值,hname是外面的key,hn是裏面的key,123456是裏面key的值
r.hset(‘hname‘, ‘zg‘, ‘456789‘) #繼續給hname設置哈希類型的值
r.hsetnx(‘hname‘,‘key2‘,‘value23‘) #為hname設置裏面的key和value,hname這個key不存在的時候才會設置
r.hmset(‘hname‘,{‘k1‘:‘v1‘,‘k2‘:‘v2‘}) #批量設置哈希類型hname的key和value
r.hget(‘hname‘, ‘hn‘) #獲取hname裏hn的值,取出來是123456
print(r.hgetall(‘hname‘)) #獲取hname裏面所有的key和value,是一個字典
r.hdel(‘hname‘,‘hn‘) #刪除哈希類型hname裏,指定的hn值
print(r.keys()) #獲取所有的key
PS:
r.set(‘user:houning‘,‘123456‘) #設置key時,如果帶冒號,則會在redis上自動建一個user的文件夾,文件夾裏存的key和value值為:user_houning,123456
r.hset(‘session:test‘,‘houning‘,‘123456‘) #哈希類型的同上,會自動創建一個session的文件夾,外面的值為“test”,裏面的key和value是:houning,123456
====== eg:寫操作redis的函數
def OperationRedis(host,passwd,k,v=False,port=6379,db=0): #因為set值時,key和value都得填,所以把v設置成默認值參數
r=redis.Redis(host=host,password=passwd,port=port,db=db)
if v: #如果傳了v的值,則設置key和value
r.set(k,v)
res=88
else: #沒有傳v的值
res=r.get(k).encode() #轉換成字符串類型
return res
Python操作數據庫(mysql redis)