標籤:relative 設定 資料 abs etc sql資料庫 遊標 字串 update
一、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)