數據庫入門-pymysql模塊的使用

1、pymysql模塊安裝

因爲本人的Python版本爲python3.7,因此用pymysql來鏈接數據庫(mysqldb不支持python3.x)html

方法一:

#在cmd輸入
pip3 install pymysql

方法二(pycharm IDE):

[File] >> [settings] >> [Project: study] >> [Project Interpreter] >>點擊右上角「+」號,搜索框輸入「pymysql」>> [Install按鈕]python

 2、鏈接數據庫

import pymysql
# 建立連接獲得一個連接對象
conn = pymysql.Connect(
    host="127.0.0.1",    # 數據庫服務器主機地址
    user="root",  # 用戶名
    password="123456", # 密碼
    database="test", #數據庫名稱
    port=3306, # 端口號 可選 整型
    charset="utf8" # 編碼  可選
)

還可使用函數的形式鏈接數據庫:mysql

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()
函數的形式

3、操做數據庫

1.鏈接對象的經常使用方法

commit()#提交穩定存儲的更改
rollback()#回滾當前事務
autocommit_mode=無 #指定的自動提交模式。無表示使用服務器默認值。

要想操做數據庫必須先創建遊標對象,不須要本身建立調用數據庫對象下面的cursor方法就能夠了sql

2.遊標對象

建立遊標:數據庫

db = pymysql.connect(config)  # 建立數據庫連接對象
cus = db.cursor     # 建立遊標對象
print(dir(cus))     # 查看遊標的方法

遊標經常使用方法:python3.x

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

4、安全問題

如何保證數據安全是近幾年來火熱的主題之一,這裏不細講,就說一些和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注入的呢?ide

經過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

相關文章
相關標籤/搜索