資料庫入門-pymysql模組的使用
阿新 • • 發佈:2018-12-10
一、pymysql模組安裝
由於本人的Python版本為python3.7,所以用pymysql來連線資料庫(mysqldb不支援python3.x)
方法一:
#在cmd輸入
pip3 install pymysql
方法二(pycharm IDE):
[File] >> [settings] >> [Project: study] >> [Project Interpreter] >>點選右上角“+”號,搜尋框輸入“pymysql”>> [Install按鈕]
二、連線資料庫
import pymysql# 建立連結得到一個連結物件 conn = pymysql.Connect( host="127.0.0.1", # 資料庫伺服器主機地址 user="root", # 使用者名稱 password="123456", # 密碼 database="test", #資料庫名稱 port=3306, # 埠號 可選 整型 charset="utf8" # 編碼 可選 )
還可以使用函式的形式連線資料庫:
import pymysql def connect_mysql(): db_info = {函式的形式'host':'192.168.13.253', 'user':'zfj', 'password':'123', 'port':3306, 'database':'day40', 'charset':'utf8' } try: db = pymysql.Connect(**db_info) print('連線成功!') except Exception as e: print('e') return db if__name__ == '__main__': db = connect_mysql()
三、操作資料庫
1.連線物件的常用方法
commit()#提交穩定儲存的更改 rollback()#回滾當前事務 autocommit_mode=無 #指定的自動提交模式。無表示使用伺服器預設值。
要想操作資料庫必須先建立遊標物件,不需要自己建立呼叫資料庫物件下面的cursor方法就可以了
2.遊標物件
建立遊標:
db = pymysql.connect(config) # 建立資料庫連結物件 cus = db.cursor # 建立遊標物件 print(dir(cus)) # 檢視遊標的方法
遊標常用方法:
cus.cursor() #建立遊標物件 cus.close() #關閉遊標物件 cus.excute(query,args=None) #執行查詢 引數: query(str) - 要執行的查詢。 args(元組,列表或字典) - 與查詢一起使用的引數。(可選的) 返回:受影響的行數 返回型別:INT executemany(查詢,args ) #針對一個查詢執行多個數據 引數: query - 要在伺服器上執行的查詢 args - 序列或對映的序列。它用作引數。 此方法可提高多行INSERT和REPLACE的效能。否則它等同於使用execute()迴圈遍歷args。 cus.fetchone() #獲取下一行 cus.fetchall() #獲取所有行 cus.fetchmany(size =None) #獲取幾行
注:sql必須是字串型別
3.示例
import pymysql # 建立連結得到一個連結物件 conn = pymysql.Connect( host="127.0.0.1", # 資料庫伺服器主機地址 user="root", # 使用者名稱 password="admin", # 密碼 database="day42", #資料庫名稱 port=3306, # 埠號 可選 整型 charset="utf8" # 編碼 可選 ) # 獲取遊標物件 pymysql.cursors.DictCursor指定 返回的結果型別 為字典 預設是元祖型別 cursor = conn.cursor(pymysql.cursors.DictCursor) # # 新增資料 # res = cursor.execute("insert into emp values(100,'胡歌','男',30,1,'job',60000)") # if res: # print("插入成功") # else: # print("插入失敗") # 提交修改 因為pymysql 模組預設是啟用事務的 你的sql語句 如果不提交 相當於沒有執行 # conn.commit() # res = cursor.execute("drop database day42") # res = cursor.execute("delete from t1 where id = 1") # print(res) 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() # 小明有100塊 準備給小花轉50 # update moneyTable set money = money - 50 where name = "小明"; # 發生一些別錯誤 如果發生了錯誤 就執行撤銷操作 rollback; # update moneyTable set money = money + 50 where name = "小花";View Code
四、安全問題
如何保證資料安全是近幾年來火熱的主題之一,這裡不細講,就說一些和pymysql相關的sql注入攻擊。
#sql = "select *from user where user = '%s' and pwd = '%s';" % (input("input userName"),input("input password")) # 當用戶輸入的使用者名稱為字串 為 yy' -- 時 # 最終產生的sql select *from user where user = 'yy' -- ' and pwd = '987657890'; # -- 用於mysql註釋 意思是 後面的內容忽略掉 # 從而導致 密碼是否正確都能登入成功 # "select *from user where user = 'axxax' or 1=1;
那python是如何避免普通的sql注入的呢?
通過excute函式,將需要傳的引數放到arg引數中,讓pymysql幫你遮蔽
count = cursor.execute("select *from user where user = %s and pwd = %s;",args=(input("user"),input("pwd"))) print(count) if count: print("login success") else: print("login error") cursor.close() conn.close()
讀者想要學習更多關於安全的內容可以關注“實驗吧”學習:http://www.shiyanbar.com/
部分參考 pymysql文件:https://pymysql.readthedocs.io/en/latest/index.html
連線物件規範:https://www.python.org/dev/peps/pep-0249/#connection-objects