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('登錄失敗')
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())
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())
具體應用:與事務合用。先建立監測,出問題則改變輸出的標志值,並回滾事務。
最后執行不出問題的事務,成功后置位。
調用時,給輸出的變量隨便賦值標志位之外的數,查看即可獲知語句的執行情況
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參數,可以兩用,僅此而已,沒有別的用法,是兩種用法的和,沒區別。