pymysql模塊

pymysql模塊

一、pymysql是什麼

pymysql是用python控制終端對MySQL數據庫進行操做的第三方模塊python

二、如何使用

下載第三方模塊pymysql:pip3 install pymysqlmysql

import pymysql
# 1.鏈接數據庫
client = pymysql.connect(
    # 地址
    host='127.0.0.1',
    # 數據庫端口
    port=3306,
    # 用戶名,要加引號
    user='root',
    # 密碼,要加引號
    password='2694',
    # 文件夾
    database='db2',
    # 設置字符編碼不能寫成了utf-8
    charset='utf8',
    # 設置自動提交命令,如不設置則沒法提交命令進行增,改,刪操做
    autocommit=True
)

# 2.獲取遊標對象 ——————》能夠經過遊標來提交SQL命令,
# pymysql.cursors.DictCursor 將查詢出來的結果製做成字典形式返回
cursor_obj = client.cursor(pymysql.cursors.DictCursor)

# 3.經過execute提交SQL語句
# SQL語句要用引號,不要加 ; 號
sql = 'select * from emp'
# 提交SQL語句
cursor_obj.execute(sql)

# 4.提交後,經過cursor_obj.fetchall()獲取查詢遊標後的所有的結果
res = cursor_obj.fetchone()  # 只獲取遊標後的一條結果
res = cursor_obj.fetchall()  # 獲取查詢遊標後的所有的結果
res = cursor_obj.fetchmany(3)  # 指定獲取遊標後的幾條數據,能夠超過不會報錯
# 獲取的是列表套字典
# print(res)
for dic in res:
    print(dic)

# 5.關閉遊標
cursor_obj.close()

# 6.關閉客戶端鏈接
client.close()

三、遊標的相對移動和絕對移動

獲取結果若是緊接着,獲取會獲取遊標後的結果sql

print(cursor_obj.fetchone())
print(cursor_obj.fetchone())
print(cursor_obj.fetchall())
>>>{'id': 1, 'name': 'Mr沈', 'sex': 'male', 'age': 17}
{'id': 2, 'name': 'tate', 'sex': 'male', 'age': 18}
[{'id': 3, 'name': 'ank', 'sex': 'male', 'age': 18},{'id': 4, 'name': 'vicky', 'sex': 'female', 'age': 18}]

若是想控制遊標的移動位置來獲取結果能夠用相對移動或絕對移動數據庫

相對移動:cursor.scroll(2, 'relative')  # 基於指針所在的位置日後偏移兩位,下次獲取就獲取指針後的數據
絕對移動:cursor.scroll(1, 'absolute')  #基於起始位置日後偏移1位

四、SQL注入問題

SQL注入問題:利用特殊符號和註釋語法,巧妙的繞過真正的SQL校驗函數

解決方法:關鍵性的數據校驗,不要手動拼接,execute會自帶拼接功能,能夠解決這個問題fetch

import pymysql
client = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    database='day36',
    user='root',
    password='2694',
    charset='utf8',
    autocommit=True
)
cursor_obj = client.cursor(pymysql.cursors.DictCursor)
username = input('請輸入用戶名').strip()
password = input('請輸入密碼:').strip()
# sql = 'select * from db where username="%s" and password="%s"'%(username,password)  # 此處%s必需要加引號
sql = 'select * from db where username="%s" and password="%s"'  # 此處%s能夠不用加引號
print(sql)
res = cursor_obj.execute(sql,(username,password))  # 自帶拼接功能將execute後的參數與SQL一一對應傳入
if res:
    print(res) # 顯示全部操做的數據條數
else:
    print('用戶名或密碼錯誤')



#請輸入用戶名wqjed" or 2=2 -- wqjdkef
# 請輸入密碼:
# select * from db where username="wqjed" or 2=2 -- wqjdkef" and password=""
# 1


# 請輸入用戶名shen" -- weiqfewq
# 請輸入密碼:
# select * from db where username="shen" -- weiqfewq" and password=""
# 1

五、數據的增刪改查

import pymysql

# 鏈接數據庫函數
def client_mysql():
    client = pymysql.connect(
        host='127.0.0.1',
        port=3306,  # 端口號不能加引號
        user='root',
        password='2694',
        database='db2',
        charset='utf8',
        autocommit=True
    )
    cursor_obj = client.cursor(pymysql.cursors.DictCursor)
    return cursor_obj, client

# 關閉數據庫函數
def close_client():
    cursor_obj, client = client_mysql()
    cursor_obj.close()
    client.close()

cursor_obj, client = client_mysql()
# 插入數據
# 插入表格
sql = 'create table user(id int primary key,name varchar(20))'
cursor_obj.execute(sql)
# 插入數據
s = 'insert into user(id,name) values(7,"vicky")'
cursor_obj.execute(s)

# 查看數據
res = 'select * from user'
cursor_obj.execute(res)
res = cursor_obj.fetchall()
print(res)

# 更新數據
try:
    sql = 'update user set name="shen" where id=7'
    cursor_obj.execute(sql)
except Exception as e:
    print(e)
res = 'select * from user'
# 查看更新後的數據
cursor_obj.execute(res)
res = cursor_obj.fetchall()
print(res)

# 刪除數據
sql = 'delete from user'
cursor_obj.execute(sql)
# 查看更新後的數據
res = 'select * from user'
cursor_obj.execute(res)
res = cursor_obj.fetchall()
print(res)
# 關閉鏈接
close_client()
相關文章
相關標籤/搜索