1. 程式人生 > >資料庫入門-pymysql模組的使用

資料庫入門-pymysql模組的使用

一、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