pymysql
pymysql 是一個第三方模塊,幫我們封裝了 建立表/用戶認證/sql的執行/結果的獲取
import pymysql
# 步驟
'''
1. 連接服務端
2. 用戶認證
3. 發送指令
4. 提取結果
'''
# 1.連接服務器,獲取連接對象(本質上就是封裝好的socket)
conn = pymysql.connect(
host = "127.0.0.1", # 如果是本機,可以忽略
port = 3306, # 如果沒有改過,可以忽略
user = "root",
password = "123",
db = "test_7_17"
)
# 2.通過連接拿到游標對象
# 默認返回的游標是元祖類型,不方便使用,更換為字典類型的游標
c = conn.cursor(pymysql.cursors.DictCursor)
# 3.執行sql
sql = "select * from user"
# 返回的是查詢結果數量
count = c.execute(sql)
# 4.提取結果
print(c.fetchall()) # 查看所有
c.scroll(-2,mode="relative") # 因為查看完后,游標已經到最后面,所有要再次查看,就要移動游標,relative表示相對位置,即游標現在所在位置,-2表示,往前移動2個位置
print(c.fetchone()) # 查看一個值 默認是第一個,
c.scroll(0,mode="absolute") # absolute 表示絕對位置,即從第一個位置開始,0表示將游標移動到第一個位置
print(c.fetchmany(2)) # 查詢多個括號內加參數,2表示查詢2個值
# 5 關閉連接
c.close()
conn.close()
sql 注入攻擊
指的是一些程序員,在輸入數據時,按照sql的語法規范,提交了用於攻擊性目的的數據
如果避免這個問題?
在服務端執行sql前 先做sql的驗證
在pymysql中,已經封裝了驗證操作,我們只需要將參數交給pymysql來做拼接即可.
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "root",
password = "123",
db = "test_7_17"
# autocommit = False # 如果改成True 就表示開啟自動提交,不常用,pymysql中默認開啟事務,所以我們必須在每次執行完成后,commit提交下
)
c = conn.cursor(pymysql.cursors.DictCursor)
name = input("name>>>").strip()
pwd = input("pwd>>>").strip()
# 不能把變量名直接放到sql執行語句中,防止sql攻擊
sql = "select * from user where name = %s and pwd = %s"
count = c.execute(sql,(name,pwd))
if count:
print("登陸成功")
else:
print("登陸失敗")
print(c.fetchall())
c.scroll(-2,mode="relative")
print(c.fetchone())
c.scroll(0,mode="absolute")
print(c.fetchmany(2))
調用存儲過程
# 創建存儲過程
delimiter |
create procedure add1(in a int, in b int, out c int)
begin
set c = a + b;
end |
delimiter ;
# pymysql 中調用
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "root",
password = "123",
db = "test_7_17")
c= conn.cursor(pymysql.cursors.DictCursor)
c.callproc("add1",(1,2,5)) # 1 對應 @_add1_0 ,2 對應 @_add1_1 , 5 對應 @_add1_2
c.execute("select @_add1_2") # 所以返回結果的調用得用第三個變量
print(c.fetchall())
# 調用存儲過程時,傳入參數,會自動定義成變量,
# 命名方式,@_過程的名稱_參數的索引, 從0開始