利用PyMySQL模块操作数据库
連接到數(shù)據(jù)庫(kù)
import pymysql # 創(chuàng)建鏈接得到一個(gè)鏈接對(duì)象 conn = pymysql.Connect(host="127.0.0.1", # 數(shù)據(jù)庫(kù)服務(wù)器主機(jī)地址user="root", # 用戶名password="root", # 密碼database="test", #數(shù)據(jù)庫(kù)名稱port=3306, # 端口號(hào) 可選 整型charset="utf8" # 編碼 可選 )和命令行一直的是是要指定IP端口,用戶授權(quán),不過(guò)用戶要操作的數(shù)據(jù)庫(kù)必須要在pymysql連接之前就要存在,不然就要報(bào)錯(cuò)。
獲得游標(biāo)
,類比命令行,登錄命令行之后會(huì)有mysql>的提示符提示你進(jìn)行操作,用代碼操作數(shù)據(jù)庫(kù)需要獲得相應(yīng)的游標(biāo),傳入的pymysql.cursors.DictCursor參數(shù)是指定返回的結(jié)果是字典類型的數(shù)據(jù),pymysql會(huì)給字典加上字典容器,最后返回的是列表,列表的元素時(shí)字典,字典的鍵值是對(duì)應(yīng)的字段和數(shù)據(jù)
cursor = conn.cursor(pymysql.cursors.DictCursor) # 將查詢結(jié)果做成字典的格式執(zhí)行SQL語(yǔ)句
我們通常將sql語(yǔ)句放在字符串中,比如
select_sql = ""select * from table_name"" # 要在sql語(yǔ)句中指定數(shù)據(jù)表了,要不然查不到數(shù)據(jù) insert_sql = "insert into table_name( name,age) values(%s,%s)"%("ruhai",18) updata_sql = "update user set username='superamdin' where name = admin"我們將寫好的SQL語(yǔ)句交給cursor.execute()來(lái)執(zhí)行,就相當(dāng)于你把命令敲在命令行中并敲了一下回車,得到sql語(yǔ)句的執(zhí)行結(jié)果。
cursor.execute(select_sql) cursor.commit() # 因?yàn)閜ymysql 模塊默認(rèn)是啟用事務(wù)的 你的sql語(yǔ)句 如果不提交 相當(dāng)于沒(méi)有執(zhí)行獲得結(jié)果
我們用一個(gè)變量值來(lái)獲得查詢的結(jié)果
res = cursor.execute(select_sql)直接打印可以得到結(jié)果的條目數(shù)
print(res)獲得具體數(shù)據(jù)
cursor.fetchone() cursor.fetchall()游標(biāo)的移動(dòng)
在數(shù)據(jù)庫(kù)中,游標(biāo)是一個(gè)十分重要的概念。游標(biāo)提供了一種對(duì)從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手段,就本質(zhì)而言,游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條SQL 查詢語(yǔ)句相關(guān)聯(lián)因?yàn)橛螛?biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語(yǔ)句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對(duì)結(jié)果集進(jìn)行處理時(shí),必須聲明一個(gè)指向該結(jié)果集的游標(biāo)。如果曾經(jīng)用C 語(yǔ)言寫過(guò)對(duì)文件進(jìn)行處理的程序,那么游標(biāo)就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對(duì)于游標(biāo)而言,其道理是相同的。
cursor.scroll(1,mode='relative') # 相對(duì)當(dāng)前位置移動(dòng)【1:表示向下移動(dòng)一行,-1:表示向上移動(dòng)一行】 cursor.scroll(1,mode='absolute') # 相對(duì)絕對(duì)位置移動(dòng) 【1:表示向上移動(dòng)一行,-1:表示向下移動(dòng)一行】敏感信息的防護(hù)
防止sql注入
來(lái)看下面的代碼
username=input() password =input() # 正常構(gòu)造語(yǔ)句的情況 sql = "select user,pwd from User where user='%s' and pwd='%s'" % (username,password)row_count = cursor.execute(sql)其實(shí)用戶可以這樣輸入實(shí)現(xiàn)免帳號(hào)登錄:
username: ‘or 1 = 1 –-password:如若沒(méi)有做特殊處理,那么這個(gè)非法用戶直接登陸進(jìn)去了.
當(dāng)輸入了上面的用戶名和密碼,服務(wù)端的sql就變成:
sql = "select user,pwd from User where user=‘'or 1 = 1 –-' and pwd='%s'"因?yàn)闂l件后面username=”or 1=1 用戶名等于 空 或1=1 那么這個(gè)條件一定會(huì)成功;然后后面加兩個(gè)-,這意味著注釋,它將后面的語(yǔ)句注釋,讓他們不起作用,這樣語(yǔ)句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過(guò)系統(tǒng),獲取合法身份。
使用pymysql提供的參數(shù)化語(yǔ)句防止注入
#執(zhí)行參數(shù)化查詢 row_count=cursor.execute("select user,pwd from User where user='%s' and pwd='%s'" ,(username,password)) #execute()函數(shù)本身就有接受SQL語(yǔ)句變量的參數(shù)位,只要正確的使用(直白一點(diǎn)就是:使用”逗號(hào)”,而不是”百分號(hào)”)就可以對(duì)傳入的值進(jìn)行correctly轉(zhuǎn)義,從而避免SQL注入的發(fā)生。數(shù)據(jù)一致性驗(yàn)證
小明有100塊 準(zhǔn)備給小花轉(zhuǎn)50,如果這個(gè)時(shí)候突然發(fā)生了一些事情導(dǎo)致這個(gè)數(shù)據(jù)值存成功了一半,把小明的錢從系統(tǒng)中扣件掉了,但是沒(méi)有給小花加上去,那么就會(huì)造成數(shù)據(jù)的不一致,這個(gè)時(shí)候應(yīng)該加上容錯(cuò)機(jī)制提高程序的健壯性,和數(shù)據(jù)的安全。
try:cursor.execute("update moneyTable set money = money - 50 where name = '小明'")#如果小花的賬戶出問(wèn)題了 無(wú)法更新數(shù)據(jù) 那就需要回滾cursor.execute("update moneyTable set money = money + 50 where name = '小花'")conn.commit() except:conn.rollback()關(guān)閉連接
cursor.close() conn.close()操作數(shù)據(jù)庫(kù)的完整代碼
import pymysqlconn = pymysql.Connect(host="127.0.0.1", user="root", password="admin", database="day42", port=3306, charset="utf8" ) cursor = conn.cursor(pymysql.cursors.DictCursor)sql = "insert into user(username,pwd) values(%s,%s)"try:cursor.execute(sql,args= (user,name))conn.commit() except:conn.rollback() cursor.close() conn.close()轉(zhuǎn)載于:https://www.cnblogs.com/ruhai/p/10876084.html
總結(jié)
以上是生活随笔為你收集整理的利用PyMySQL模块操作数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: git将代码提交到多个远程仓库
- 下一篇: AQS独占式同步队列入队与出队