一、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
焚膏油以繼晷,恒兀兀以窮年。