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