與python交互之前我們需要安裝一個MySQL的驅(qū)動模塊Connector,這個驅(qū)動模塊直接在cmd命令行輸入
pip
install
mysql.connector
安裝是否成功可以接著輸入
python
# 輸入之后,會進(jìn)入python解釋器(前提是python已經(jīng)配置好了環(huán)境變量
# 導(dǎo)入安裝的模塊,沒有報(bào)錯即安裝成功
import mysql.connector
進(jìn)入自己的編輯器(pycharm)首先連接數(shù)據(jù)庫方式:
數(shù)據(jù)庫連接
1、當(dāng)前模塊直接連接
import mysql.connector # 連接數(shù)據(jù)庫 con = mysql.connector.connect( host = " 127.0.0.1 " , port =3306 , user = " root " , # 可以填寫其他用戶,用戶的變量名是user password= " XXXXXX " , # 這里填寫上面用戶對應(yīng)的密碼 database= " dbname " # 需要連接的數(shù)據(jù)庫的名字 ) ...... ...... ...... # 使用完數(shù)據(jù)庫之后,需要關(guān)閉數(shù)據(jù)庫,不要浪費(fèi)資源 con.close()
2、導(dǎo)入配置文件進(jìn)行連接
# 先創(chuàng)建一個配置文件 config.py import mysql.connector # 下面是字典類型 config = { " host " : " 127.0.0.1 " , " port " : 3306 , " user " : " root " , " password " : " XXXXXX " , " database " : " dbname " } # 再創(chuàng)建一個文件connect.py import mysql.connector from config import config # 使用配置文件連接 con = mysql.connector.connect(** config) # 關(guān)閉連接 con.close()
游標(biāo)
游標(biāo)的作用是執(zhí)行sql語句,或者保存sqi結(jié)果集。常用的方法:
cursor()創(chuàng)建游標(biāo)(使用連接)
execute()執(zhí)行sql語句;可以接受兩個參數(shù),形如下面涉及的預(yù)編譯
executemany()循環(huán)執(zhí)行相同的sql語句第二個參數(shù)必須是一個列表
fetchall()/fetchone()獲取全部數(shù)據(jù)/一條數(shù)據(jù)
# 創(chuàng)建一個游標(biāo) cursor = con.cursor() # 假設(shè)有兩個sql語句一個是查詢,一個是執(zhí)行insert語句 cursor.execute(sql_select) # 這個結(jié)果集是保存在cursor中,你可以通過fetechall()獲取全部數(shù)據(jù)或者fetchone()查詢第一條數(shù)據(jù) data = cursor.fetchall() # 得到的數(shù)據(jù)我們可以進(jìn)行業(yè)務(wù)的處理 # 執(zhí)行創(chuàng)建語句,不會結(jié)果集 sql = " insert into s_region values(%s, %s) " data = [[1, " sd " ],[2, " dfd " ]] # 或者里面是元組的形式data = [(1,"sd"),(2,"dfd")] cursor.execute(sql, data)
?
防止SQL注入攻擊方式
為什么存在SQL注入攻擊?輸入一個不與數(shù)據(jù)表格的數(shù)據(jù)匹配也是可以繼續(xù)執(zhí)行的。比如用戶輸入特定的錯誤字符串格式數(shù)據(jù),還是可以通過驗(yàn)證登錄進(jìn)去
import mysql.connector # 連接數(shù)據(jù)庫 # 1、本模塊創(chuàng)建連接并保存在變量中 con = mysql.connector.connect( host = " 127.0.0.1 " , port =3306 , user = " root " , password = " 123456 " , database = " briup2 " ) # 2、創(chuàng)建數(shù)據(jù)庫游標(biāo) cursor = con.cursor() # 模擬登錄:賬戶:last_name,密碼:first_name username = " 1 or 1=1 " password = " 1 or 1=1 " # 3、定義一個sql語句 sql = " select count(*) from user_table where user_id=%s and user_psd=%s " % (username, password) # 4、執(zhí)行sql語句 ursor.execute(sql ) # 5、獲取全部結(jié)果集 data = cursor.fetchall() print (data) # 總之結(jié)果不為0
上述結(jié)果不為0表示后臺可以查到某個結(jié)果集,即用戶是可以登錄進(jìn)入(主頁);如果可以注入攻擊就可以刪掉某個數(shù)據(jù)表的所有數(shù)據(jù),這樣做是很危險(xiǎn)的,所以需要后臺處理得到的數(shù)據(jù)
id = " 1 or 1=1 " sql = " delete from tbname where id=%s " % (id) # 將訂單表數(shù)據(jù)全部刪除了--欲哭無淚 delete from tbname where id=1 or 1=1
防止SQL注入攻擊的三種方式:
1、通過單引號將獲取的值轉(zhuǎn)換為字符串:format格式
# 將上面的sql語句改成下面這一語句,注意大括號兩邊都有引號 sql = " select count(*) from user_table where user_id=’{}‘ and user_psd='{}' " .format(username, password)
2、通過單引號將獲取的值轉(zhuǎn)換為字符串:字符串格式
# 將上面的sql語句改成下面這一語句,注意%s兩邊都有引號 sql = " select count(*) from user_table where user_id=’%s‘ and user_psd='%s' " %(username, password)
3、通過預(yù)編譯的方式防止SQL注入攻擊(推薦使用)
# 將上面的sql語句改成下面這一語句,注意%s兩邊都沒有引號 sql = " select count(*) from user_table where user_id=%s and user_psd=%s " # 再將執(zhí)行語句改成下面這條 cursor.execute(sql, (username, password))
事務(wù)控制
事務(wù)的產(chǎn)生是因?yàn)閷?shù)據(jù)表操作之后,數(shù)據(jù)庫不會發(fā)生改變,若想發(fā)生改變,就需要事務(wù)三操作
事務(wù)控制一般有三步操作:
1、開啟事務(wù):通過連接開啟事務(wù),調(diào)用start_transaction()
2、提交事務(wù):也是通過連接提交事務(wù),一般都是適用于對數(shù)據(jù)表的增加、刪除、修改等操作,調(diào)用commit()
3、回滾事務(wù):一般是發(fā)生異常之后才會執(zhí)行的回滾,調(diào)用rollback()
這三步都應(yīng)該在異常中執(zhí)行

import mysql.connector # 連接數(shù)據(jù)庫 try : """ 數(shù)據(jù)庫的連接,數(shù)據(jù)表的增加、刪除、修改操作 都是需要在異常中處理 """ # 1、本模塊創(chuàng)建連接并保存在變量中 con = mysql.connector.connect( host = " 127.0.0.1 " , port =3306 , user = " root " , password = " 123456 " , database = " briup2 " ) # 2、創(chuàng)建數(shù)據(jù)庫游標(biāo) cursor = con.cursor() # 3、開啟事務(wù) con.start_transaction() # 4、執(zhí)行一條update語句 sql = " update user_table set username='aaa' " # 5、執(zhí)行sql語句 cursor.execute(sql) # 6、提交事務(wù) con.commit() except : """ 在發(fā)生異常之前,還需判斷連接是否成功 發(fā)生異常之后一般都是需要回滾,以免數(shù)據(jù)發(fā)生錯誤 """ if " con " in dir(): con.rollback() finally : """ 無論異常與否,都要執(zhí)行finally語句 """ con.close()
數(shù)據(jù)庫連接池(緩存)
上述代碼的開頭都會寫創(chuàng)建數(shù)據(jù)庫的連接和最后也會寫數(shù)據(jù)庫的關(guān)閉,如果程序反復(fù)創(chuàng)建和關(guān)閉,是會浪費(fèi)大量的資源。而數(shù)據(jù)庫連接池是在程序運(yùn)行之前就已經(jīng)緩存好了,那么就可以直接獲取連接就行,而且不使用數(shù)據(jù)庫也不用關(guān)閉,緩存機(jī)制會自動回收

# 先創(chuàng)建一個配置文件 config.py config = { " host " : " 127.0.0.1 " , " port " : 3306 , " user " : " root " , " password " : " 123456 " , " database " : " briup2 " } # 在創(chuàng)建一個測試文件 exam.py import mysql.connector.pooling from config import config pool = mysql.connector.pooling.MySQLConnectionPool( ** config, pool_size =10 ) try : # 2、先獲取一個連接 con = pool.get_connection() # 3、開啟事務(wù) con.start_transaction() # 4、創(chuàng)建一個游標(biāo) cursor = con.cursor() # 5、定義sql語句 sql_create = " create table s_emp_new like s_emp; " sql_insert = """ insert into s_emp_new select * from s_emp where dept_id in ( select dept_id from s_emp group by dept_id having avg(salary)>( select avg(salary) from s_emp ) ) """ sql_update = " update s_emp_new set dept_id = 44 " # 6、執(zhí)行sql語句 cursor.execute(sql_create) cursor.execute(sql_insert) cursor.execute(sql_update) # 7、提交事務(wù) con.commit() tip = " 執(zhí)行成功! " except Exception as e: if " con " in dir(): # 8、回滾事務(wù) con.rollback() tip = " 執(zhí)行失敗! " print (e) finally : print (tip)
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
