mysql在py中的使用(pymysql)


0 安裝模塊,pip install pymysql

1 pymql的作用是在python程序中操作mysql,同樣是一個客戶端,需要鏈接服務端后進行數據操作

 1 import pymysql
 2 #鏈接需要指定所鏈接的ip地址和端口號,本地客戶端可以直接寫localhost,
 3 #建立鏈接需要指定字符集編碼,此時為utf8,不是utf-8
 4 conn=pymysql.connect(host='localhost',
 5                      port=3306,
 6                      user='root',
 7                      password='407509',
 8                      #database='test',
 9                      charset='utf8')
10 cursor = conn.cursor()
11 
12 sql = 'show databases;'
13 res = cursor.execute(sql)
14 print(cursor.fetchall())
鏈接數據庫,查看庫

2 數據查看方式和游標的定位的修改

 1 import pymysql
 2 
 3 conn=pymysql.connect(host='localhost',
 4                      port=3306,
 5                      user='root',
 6                      password='407509',
 7                      database='test', #此處指定了庫之后,不需要再使用use進入庫中,可以直接進行相關表操作
 8                      charset='utf8')
 9 #j建立游標,開始相關操作
10 #cursor = conn.cursor()  #此時拿到的結果為元組類型,且不顯示字段名
11 cursor = conn.cursor(pymysql.cursors.DictCursor)  #此時拿到的結果為字典類型,鍵為字段名
12 
13 sql = "select * from test_1;"
14 res = cursor.execute(sql)  #res的值為:這些sql影響到的行數
15 
16 print(cursor.fetchall()) #取所有數據
17 print(cursor.fetchone()) #取第一條數據
18 print(cursor.fetchmany(2)) #取多條數據,注意,每次取完之后,游標下移,不自動返回,類似讀文件
19 
20 #重新閱讀數據則需要定位游標
21 #定位由兩種模式,第一種,絕對定位
22 cursor.scroll(0,'absolute')  #定位到第0,1...n行數據
23 print(cursor.fetchmany(2))
24 
25 #定位由兩種模式,第二種,相對定位
26 cursor.scroll(-1,'relative')  #定位到當前游標的后n行數據,若為負數則往前
27 print(cursor.fetchmany(2))
游標的定位

 3 需要字符串拼接的時候,要防止sql注入。

 sql注入指得是熟悉sql操作的程序員通過在輸入的內容中加注釋符號、與‘1’求並集等操作,使其恆成立,繞開一些設置。

例如在用戶名密碼的登錄驗證中輸入'--'等,

python針對字符串拼接這種高危操作,提供了自己的方法,在語句后加一個列表,內含所拼接內容,不符合則不執行

 1 import pymysql
 2 user = input('請輸入用戶名:').strip()
 3 password = input('請輸入密碼:').strip()
 4 
 5 
 6 conn=pymysql.connect(host='localhost',
 7                      port=3306,
 8                      user='root',
 9                      password='407509',
10                      database='test',
11                      charset='utf8')
12 
13 cursor = conn.cursor(pymysql.cursors.DictCursor)
14 sql = "select * from test_1 where name=%s and password=%s"
15 res = cursor.execute(sql,[user,password])
16 
17 if res:
18     print('登陸成功')
19 else:
20     print('登錄失敗')
避免sql注入

 4 增刪改數據需要刷新才生效

方法:鏈接.commit()

 1 import pymysql
 2 conn=pymysql.connect(host='localhost',
 3                      port=3306,
 4                      user='root',
 5                      password='407509',
 6                      database='test',
 7                      charset='utf8')
 8 
 9 cursor = conn.cursor(pymysql.cursors.DictCursor)
10 sql = "delete from test_1 where password = '4'"
11 
12 res = cursor.execute(sql)
13 
14 conn.commit()
15 
16 sql = "select * from test_1"
17 res = cursor.execute(sql)
18 print(cursor.fetchall())
commit()

 5 存儲過程舉例(無參數)

 1 import pymysql
 2 conn=pymysql.connect(host='localhost',
 3                      port=3306,
 4                      user='root',
 5                      password='407509',
 6                      #database='test',
 7                      charset='utf8')
 8 cursor = conn.cursor()
 9 
10 
11 cursor.callproc('p3')  #字符串是存儲過程的名字
12 conn.commit()   #直接執行存儲過程
13 print(cursor.fetchall())
執行無參的存儲過程

 6 存儲過程舉例(有參數)

6.1 創建輸入存儲過程

delimiter //        --聲明結束符
create procedure p2(in n1 int,in n2 int) --聲明變量和變量類型
begin
select * from test_1 where password>n1;
end//
delimiter ;

調用輸入存儲過程

 1 import pymysql
 2 conn=pymysql.connect(host='localhost',
 3                      port=3306,
 4                      user='root',
 5                      password='407509',
 6                      database='test',
 7                      charset='utf8')
 8 cursor = conn.cursor()
 9 
10 cursor.callproc('p2',(3,4))  #以元組的形式傳入多個參數
11 conn.commit()   
12 print(cursor.fetchall())
調用輸入參數的存儲過程

6.2 創建輸出存儲過程

delimiter //
create procedure p3(in n1 int,out res int)
begin
select * from test_1 where password>n1;
set res = 1;
end//
delimiter
mysql調用時
set @res=0;
call p3(3,@res); 注意@的位置,外面加@
select @res; 查看變量值

調出輸出存儲過程

 1 import pymysql
 2 conn=pymysql.connect(host='localhost',
 3                      port=3306,
 4                      user='root',
 5                      password='407509',
 6                      database='test',
 7                      charset='utf8')
 8 cursor = conn.cursor(pymysql.cursors.DictCursor)
 9 
10 cursor.callproc('p3',(3,0))  
11 #以元組的形式傳入多個參數,out參數的輸入直接為具體數據
12 
13 conn.commit()
14 print(cursor.fetchall())
15 sql = 'select @_p3_1;'  #注意查看方法,@加_加過程名_加序號
16 res = cursor.execute(sql)
17 print(cursor.fetchall())
View Code

具體應用:與事務合用。先建立監測,出問題則改變輸出的標志值,並回滾事務。

最后執行不出問題的事務,成功后置位。

調用時,給輸出的變量隨便賦值標志位之外的數,查看即可獲知語句的執行情況

delimiter //
create procedure p4(out p_return_code tinyint)
begin
declare exit handler for sqlexception #監測,一旦出現異常,執行下面的內容
begin
set p_return_code = 1;
rollback; -- 回滾事務
end;
declare exit handler for sqlwarning
begin
set p_return_code = 2;
rollback;
end;
start transaction;
delete from tb1;
commit;
set p_return_code = 0;
end//
delimiter ;

#在mysql中調用
set @x=3;
call p4(@x);
select @x;
#在python中基於pymysql調用
cursor.callproc('p4',(3,))
print(cursor.fetchall()) #查詢select的查詢結果
cursor.execute('select @_p4_0;') 
print(cursor.fetchall())

6.3 inout參數

 定義一個inout參數,可以兩用,僅此而已,沒有別的用法,是兩種用法的和,沒區別。

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM