前言:在現代應用程序中,數據庫扮演者至關重要的角色。mysql是一個流行的關系型數據庫管理系統,廣泛應用于各種規模的應用中。在pytho中,我們可以通過連接庫與mysql數據庫進行交互,實現數據的增刪改查操作。與此同時,為了提高應有的性能,連接池作為一個優化數據庫連接管理技術,得到了廣泛的應用
一:安裝Python MySQL連接庫
用于與mysql數據庫進行交互
1:安裝mysql-connector-python
pip install mysql-connector-python
2:安裝pymysql(作為代替)
pip install pymysql
二:python連接mysql數據庫
vim aaa.py
import pymysql? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/1
db = pymysql.connect(host="192.168.10.101",user="root",password="pwd123",database="testdb")? /2
cursor = db.cursor()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/3
cursor.execute("select * from users")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /4
results = cursor.fetchall()
for row in results:
? ? ? ? ?print(row)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/5
cursor.close()
db.close()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /6
以上五個部分解釋:
1:導入數據庫,需要導入pymysql模塊,使用它來連接mysql數據庫并執行sql語句
2:創建數據庫連接,pymysql.connect()方法來建立數據庫連接。連接時需要提供mysql服務器的地址、用戶名、密碼和我們要訪問的數據庫名
3:創建游標對象,建立連接之后,需要創建一個游標對象,通過它來執行sql語句
4:執行sql語句,通過游標對象的execute()方法,我們可以執行sql語句,在執行sql語句時,可以使用%s占位符來避免sql注入攻擊
5:獲取查詢結果,對于查詢操作,fetchall()方法用于獲取所有結果,fetchone()方法用于獲取單條記錄
6:關閉連接:操作完成后,需要關閉游標和數據庫連接
三:常見的mysql操作
1:插入數據(INSERT)
插入數據時,我們使用insert into語句,通過execute()方法執行插入操作。為了防止SQL注入攻擊,插入語句中的值應使用%s占位符
cursor.execute("insert into users (name,age) values (%s,%s)",("Alice",25))
db.commit()? ? ? ? ? ? ? ? ? ? ? ? ?/提交事務,保存插入數據
2:更新數據(UPDATE)
更新數據時,使用update語句,通過execute()方法執行,通常會添加where條件,以確保只更新需要更新的記錄
cursor.execute("update users set age=%s where name = %s",(26,"Alice"))
db.commit()? ?
3:刪除數據(DELETE)
刪除數據時,使用delete語句,并通過where條件確保刪除特定記錄
cursor.execute("delete from users where name =%s",("Alice",))
db.commit()? ?
4:查詢數據(SELECT)
查詢數據時,使用select語句。可以使用fetchall()獲取所有記錄,或使用fetchone()獲取一條記錄
cursor.execute("select * from users")
results=cursor.fetchall()
for row in results:
? ? ?print(row)
5:執行多條sql語句
對于批量插入、更新等操作,可以使用executemany()方法一次執行多條sql語句
cursor.executemany("insert into user (name,age) values (%s,%s)",[ ("Bob",30),("charlie",35)] )
db.commit()
6:使用LIKE進行模糊查詢
LIKE關鍵字允許你進行模糊查詢。可以使用%通配符來匹配任意字符
cursor.execute("select * from users where name like %s",("%a%",))
results=cursor.fetchall()
for row in results:
? ? ? ? print(row)
7:使用JOIN進行聯合查詢
在多個表之間建立關系時,JOIN關鍵字用于合并多個表的數據
cursor.execute(""" select users.name,orders.amount from users inner join orders on users.id=orders.user_id """)
results=cursor.fetchall()
for row in results:
? ? ?print(row)
四:使用連接池
1:連接池簡介
連接池技術能夠在高并發場景下提升數據庫連接的效率,在連接池中,多個數據庫連接被提前創建并放入池中,客戶端通過池獲取連接,而不是每次都建立新的連接。這大大減少了連接和銷毀的開銷
2:創建連接遲
pymysql并不直接支持連接池,但我們可以使用DBUtils庫萊創建連接池。首先需要安裝DButils:
pip install dbutils
from dbutils.pooled_db import pooledDB
import pymysql
dbconfig= {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? "host":"localhost",
? ? ? ? "user":"root",
? ? ? ? "password":"pwd123",
? ? ? ? "database":"testdb"
? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/數據庫連接配置
connection_pool=PooledDB(
? ? ? ? creator=pymysql,? ? ? ? ? ? ? ? ? ? ? ? ? ?/使用pymysql作為數據庫連接庫
? ? ? ? maxconnections=5,? ? ? ? ? ? ? ? ? ? ? ?/連接池中最大連接數
? ? ? ? **dbconfig
)
3:獲取連接
從連接池中獲取連接時,可以使用connection()方法。每次獲取到的連接都可以直接執行數據庫操作
db_connection=connection_pool.connection()
cursor=db_connection.cursor()
cursor.exesute("select *? from users")
results=cursor.fetchall()
for row in results:
? ? ?print(row)
cursor.close()
db_connection.close()? ? ? ? ? ? ? ? ? ? ? ? ? /連接會自動歸還給連接池
4:連接池的優勢
性能提升:連接池減少了每次數據庫操作時創建新連接的開銷,提高了數據庫操作的效率
資源管理:連接池能夠限制最大連接數,避免因過多的數據庫連接導致數據庫過載
更易管理:通過連接池,可以統一管理連接的生命周期,簡化代碼結構
五:事務管理
事務是由多個sql語句組成的一個工作單元。事務保證了數據的原子性,即所有操作要么都成功,要么都失敗
1:開始事務
事務可以通過start transaction來顯式開啟,但一般我們通過執行sql語句來啟動事務
cursor.execute("start transaction")
2:提交事務
如果事務中的所有操作都成功,我們使用commit()方式提交事務,保存對數據庫的更改
db.commit()
3:回滾事務
如果事務中的某些操作失敗,我們可以使用rollback()方法回滾事務,將所有更改撤銷
db.rollback()
4:事務的隔離級別
mysql支持四種事務隔離級別,它們定義了在并發事務執行時一個事務的操作對于其他事務的影響
隔離級別的設置越高,事務間的干擾越小,但同時可能導致性能下降。mysql的默認隔離級別是repeatable read,具體如下;
(1)READ UNCOMMITTED(未提交讀)
描述:事務可以讀取其他事務未提交的數據,可能導致“臟讀”(Dirty Read)。這種級別下,事務間的隔離性最差。
應用場景:通常不推薦使用,除非對數據一致性要求不高。
使用方法:
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" )
(2)READ COMMITTED(提交讀)
描述:事務只能讀取其他事務已經提交的數據,避免了臟讀,但仍然可能遇到“不可重復讀”(Non-repeatable Read)的問題。即事務中讀取的數據在兩次讀取時可能發生變化(另個事務已提交了修改)。
應用場景:適用于大多數常見場景,提供了一定的隔離性,同時保證了較好的性能。
使用方法:
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
(3)REPEATABLE READ(可重復讀)
描述:事務可以保證在事務內多次讀取同一數據時,其值不會發生變化。這避免了“不可重復讀”的問題,但依然可能會出現“幻讀”(Phantom Read),即一個事務讀取的數據集在事務執行過程中發生了變化。
應用場景:對于需要保證事務數據一致性的場景,例如金融系統中的余額操作等,可以考慮使用該隔離級別。
使用方法:
Cursor.execute("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ" )
(4)SERIALIZABLE(串行化)
描述:這是最嚴格的事務隔離級別,事務會被執行得像串行一樣,完全避免了臟讀、不可重復讀和幻讀。然而,這種隔離級別的性能開銷最大,可能導致大量的鎖競爭。
應用場景:適用于對數據一致性要求極高的場景,如庫存管理系統、銀行轉賬等。
使用方法:
cursor.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")
5:事務隔離級別總結
READ UNCOMMITTED:允許臟讀,最低的隔離級別,性能最好,但容易出現數據不一致的情況。READ COMMITTED:解決了臟讀問題,但可能出現不可重復讀。
REPEATABLE READ:解決了臟讀和不可重復讀問題,但可能出現幻讀,
SERIALIZABLE:解決了所有問題,但性能最差,可能導致事務長時間等待。