天天看點

資料庫入門-pymysql子產品的使用

一、pymysql子產品安裝

由于本人的Python版本為python3.7,是以用pymysql來連接配接資料庫(mysqldb不支援python3.x)

方法一:

#在cmd輸入
pip3 install pymysql      

方法二(pycharm IDE):

[File] >> [settings] >> [Project: study] >> [Project Interpreter] >>點選右上角“+”号,搜尋框輸入“pymysql”>> [Install按鈕]

資料庫入門-pymysql子產品的使用

 二、連接配接資料庫

import pymysql
# 建立連結得到一個連結對象
conn = pymysql.Connect(
    host="127.0.0.1",    # 資料庫伺服器主機位址
    user="root",  # 使用者名
    password="123456", # 密碼
    database="test", #資料庫名稱
    port=3306, # 端口号 可選 整型
    charset="utf8" # 編碼  可選
)      

還可以使用函數的形式連接配接資料庫:

資料庫入門-pymysql子產品的使用
資料庫入門-pymysql子產品的使用
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.示例

資料庫入門-pymysql子產品的使用
資料庫入門-pymysql子產品的使用
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

焚膏油以繼晷,恒兀兀以窮年。