Python操作MySQL數(shù)據(jù)庫的方法實(shí)例
前言
在現(xiàn)代應(yīng)用程序中,數(shù)據(jù)庫至關(guān)重要。MySQL 是流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),廣泛用于各類應(yīng)用。本文以 MySQL 服務(wù)器:192.168.10.101、Python 服務(wù)器:192.168.10.102 為例,講解 Python 遠(yuǎn)程操作 MySQL 完整流程,包含連接、CRUD、模糊查詢、JOIN、事務(wù)、隔離級(jí)別、連接池,并補(bǔ)充 MySQL 端創(chuàng)建遠(yuǎn)程用戶、授權(quán)、舊認(rèn)證插件兼容。
一、安裝 Python MySQL 連接庫
1. 安裝命令
pip install mysql-connector-python pip install pymysql
2. 補(bǔ)充知識(shí)點(diǎn)
- pymysql:純 Python 實(shí)現(xiàn)的 MySQL 客戶端,跨平臺(tái),支持 TCP/IP 遠(yuǎn)程連接。
- dbutils:數(shù)據(jù)庫連接池組件,用于復(fù)用連接,減少創(chuàng)建 / 銷毀連接的開銷。
- mysql-connector-python:MySQL 官方驅(qū)動(dòng),可作為 pymysql 備選。
- 生產(chǎn)環(huán)境建議固定庫版本,避免兼容性問題。
二、MySQL 服務(wù)器端配置(192.168.10.101)
執(zhí)行位置:MySQL 命令行(mysql -u root -p)
1. 創(chuàng)建遠(yuǎn)程訪問用戶
CREATE USER 'root'@'192.168.10.102' IDENTIFIED BY 'pwd123';
2. 授權(quán)數(shù)據(jù)庫權(quán)限
sql
GRANT REPLICATION ON *.* TO 'root'@'192.168.10.102';
3. 舊密碼認(rèn)證插件兼容
sql
ALTER USER 'root'@'192.168.10.102' IDENTIFIED WITH mysql_native_password BY 'pwd123';
4. 刷新權(quán)限
FLUSH PRIVILEGES;
5.添加數(shù)據(jù)
-- 創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS testdb;
-- 切換到 testdb 數(shù)據(jù)庫
USE testdb;
-- 創(chuàng)建 users 表
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INT NOT NULL
);
-- 創(chuàng)建 orders 表
CREATE TABLE IF NOT EXISTS orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2) NOT NULL,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 插入數(shù)據(jù)到 users 表
INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 35),
('David', 28);
-- 插入數(shù)據(jù)到 orders 表
INSERT INTO orders (user_id, amount) VALUES
(1, 100.50),
(2, 150.75),
(3, 200.00),
(1, 50.25);
-- -- 查詢所有用戶信息
-- SELECT * FROM users;
-- -- 查詢所有訂單信息
-- SELECT * FROM orders;
-- -- 查詢用戶及其對(duì)應(yīng)的訂單信息(JOIN查詢)
-- SELECT users.name, users.age, orders.amount
-- FROM users
-- JOIN orders ON users.id = orders.user_id;
-- -- 更新某個(gè)用戶的數(shù)據(jù),修改 Bob 的年齡
-- UPDATE users SET age = 31 WHERE name = 'Bob';
-- -- 刪除 Charlie 用戶及其對(duì)應(yīng)的訂單數(shù)據(jù)
-- DELETE FROM orders WHERE user_id = (SELECT id FROM users WHERE name = 'Charlie');
-- DELETE FROM users WHERE name = 'Charlie';
-- -- 設(shè)置事務(wù)隔離級(jí)別為 REPEATABLE READ
-- SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
補(bǔ)充知識(shí)點(diǎn)
- MySQL 8.0+ 默認(rèn)認(rèn)證插件:caching_sha2_password,pymysql 不支持。
- mysql_native_password:MySQL 5.x 與 pymysql 兼容插件。
@'192.168.10.102':僅允許該 Python 服務(wù)器連接,更安全。- 授權(quán)后必須 FLUSH PRIVILEGES 才能生效。
三、Python 連接 MySQL 數(shù)據(jù)庫
創(chuàng)建文件:01_connect.py
import pymysql
db = pymysql.connect(
host="192.168.10.101", #MySQL數(shù)據(jù)庫的地址
user="root", #數(shù)據(jù)庫的用戶名
password="pwd123", #密碼
database="testdb", #要連接的數(shù)據(jù)庫的名稱
charset="utf8mb4"
) #創(chuàng)建數(shù)據(jù)庫的連接
cursor = db.cursor() #創(chuàng)建游標(biāo)對(duì)象
cursor.execute("select * from users") #執(zhí)行SQL語句
results=cursor.fetchall()
for row in results:
print(row) #獲取查詢結(jié)果
data = cursor.fetchone()
print("MySQL 版本:", data)
cursor.close() #關(guān)閉游標(biāo)連接
db.close() #關(guān)閉數(shù)據(jù)庫連接
補(bǔ)充知識(shí)點(diǎn)
- host:必須寫 MySQL 遠(yuǎn)程 IP,不能寫 localhost。
- charset=utf8mb4:支持中文、表情,生產(chǎn)標(biāo)準(zhǔn)字符集。
- cursor:執(zhí)行 SQL、獲取結(jié)果的對(duì)象。
- 必須關(guān)閉游標(biāo)與連接,避免資源泄漏。
執(zhí)行命令
python3 01_connect.py
四、常見的 MySQL 操作
創(chuàng)建文件:02_operate.py (根據(jù)情況來寫是添加還是刪除,可以在01_connect.py的文件基礎(chǔ)上做改動(dòng),改SQL語句就行?。。∪缓蟾鶕?jù)情況改是添加還是修改什么的。然后可以在MySQL上面進(jìn)行查看)
import pymysql
db = pymysql.connect(
host="192.168.10.101",
user="root",
password="pwd123",
database="testdb",
charset="utf8mb4"
)
cursor = db.cursor()
# 創(chuàng)建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
age INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
""")
# 插入
cursor.execute("INSERT INTO users(name, age) VALUES(%s, %s)", ("Alice", 25))
db.commit()
# 查詢
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
# 更新
cursor.execute("UPDATE users SET age=%s WHERE name=%s", (26, "Alice"))
db.commit()
# 刪除
cursor.execute("DELETE FROM users WHERE name=%s", ("Alice",))
db.commit()
# 模糊查詢
cursor.execute("SELECT * FROM users WHERE name LIKE %s", ("%li%",))
print("模糊查詢:", cursor.fetchall())
# 聯(lián)合查詢
cursor.execute("""
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id
""")
print("聯(lián)合查詢:", cursor.fetchall())
cursor.close()
db.close()
補(bǔ)充知識(shí)點(diǎn)
- 增刪改必須 commit(),否則不寫入數(shù)據(jù)庫。
- %s 占位符防止 SQL 注入。
- fetchall():獲取全部;fetchone():獲取一條。
- LIKE %xxx%:全模糊匹配。
- INNER JOIN:只返回匹配成功的記錄。
執(zhí)行命令
python3 02_operate.py
五、事務(wù)管理
創(chuàng)建文件:03_transaction.py
import pymysql
db = pymysql.connect(
host="192.168.10.101",
user="root",
password="pwd123",
database="testdb"
)
cursor = db.cursor()
db.autocommit = False
try:
cursor.execute("INSERT INTO users(name, age) VALUES('Tom', 20)")
cursor.execute("UPDATE users SET age=21 WHERE name='Tom'")
db.commit()
print("事務(wù)執(zhí)行成功")
except:
db.rollback()
print("事務(wù)已回滾")
finally:
cursor.close()
db.close()
補(bǔ)充知識(shí)點(diǎn)(ACID 完整)
- 原子性(Atomicity)事務(wù)是最小單元,所有 SQL 要么全成功,要么全失敗回滾。
- 一致性(Consistency)事務(wù)前后數(shù)據(jù)完整性約束(主鍵、外鍵、非空)不被破壞。
- 隔離性(Isolation)并發(fā)事務(wù)相互隔離,避免臟讀、不可重復(fù)讀、幻讀。
- 持久性(Durability)事務(wù)提交后,修改永久生效,數(shù)據(jù)庫崩潰也不丟失。
執(zhí)行命令
python3 03_transaction.py
六、MySQL 四種事務(wù)隔離級(jí)別
執(zhí)行位置:MySQL 命令行
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
補(bǔ)充知識(shí)點(diǎn)
- READ UNCOMMITTED:可讀取未提交數(shù)據(jù) → 臟讀。
- READ COMMITTED:只能讀已提交數(shù)據(jù) → 解決臟讀。
- REPEATABLE READ:MySQL 默認(rèn) → 解決臟讀、不可重復(fù)讀。
- SERIALIZABLE:最高級(jí)別,串行執(zhí)行 → 無并發(fā)問題,性能最低。
七、使用連接池
1.需要先安裝相關(guān)軟件
pip install dbutils
2.創(chuàng)建文件:04_pool.py
from dbutils.pooled_db import PooledDB
import pymysql
#數(shù)據(jù)庫的連接配置
pool = PooledDB(
creator=pymysql,
host="192.168.10.101",
user="root",
password="pwd123",
database="testdb",
charset="utf8mb4",
maxconnections=10,
mincached=2
)
#創(chuàng)建連接池
connection_pool=PooledDb(
creator=pymysql, #使用pymysql作為數(shù)據(jù)庫連接庫
maxconnection=5, #連接池中最大連接數(shù)
**dbconfig
)
#獲取連接
db_connection=connection_pool.connection()
cursor=db_connecction.cursor()
cursor.execute("select * from users")
results=cursor.fetchall()
for row in results:
print(row)
cursor.close()
db_connection.close() #連接會(huì)自動(dòng)歸還給連接池
補(bǔ)充知識(shí)點(diǎn)
- 連接池預(yù)先創(chuàng)建連接,避免頻繁創(chuàng)建 / 銷毀,性能提升明顯。
- close() 是歸還連接池,不是關(guān)閉物理連接。
- maxconnections:最大連接數(shù),保護(hù)數(shù)據(jù)庫。
- mincached:初始空閑連接數(shù),提升啟動(dòng)速度。
- 高并發(fā)項(xiàng)目必須使用連接池。
執(zhí)行命令
python3 04_pool.py
總結(jié)
到此這篇關(guān)于Python操作MySQL數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Python操作MySQL數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python抓取并保存html頁面時(shí)亂碼問題的解決方法
這篇文章主要介紹了python抓取并保存html頁面時(shí)亂碼問題的解決方法,結(jié)合實(shí)例形式分析了Python頁面抓取過程中亂碼出現(xiàn)的原因與相應(yīng)的解決方法,需要的朋友可以參考下2016-07-07
python 提取tuple類型值中json格式的key值方法
今天小編就為大家分享一篇python 提取tuple類型值中json格式的key值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
分析語音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)
數(shù)據(jù)增強(qiáng)是一種生成合成數(shù)據(jù)的方法,即通過調(diào)整原始樣本來創(chuàng)建新樣本。這樣我們就可獲得大量的數(shù)據(jù)。這不僅增加了數(shù)據(jù)集的大小,還提供了單個(gè)樣本的多個(gè)變體,這有助于我們的機(jī)器學(xué)習(xí)模型避免過度擬合2021-06-06
Django數(shù)據(jù)庫表反向生成實(shí)例解析
這篇文章主要介紹了Django數(shù)據(jù)庫表反向生成實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
對(duì)python requests發(fā)送json格式數(shù)據(jù)的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python requests發(fā)送json格式數(shù)據(jù)的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Python利用ftplib庫實(shí)現(xiàn)ftp文件傳輸自動(dòng)化全攻略
本文介紹了Python標(biāo)準(zhǔn)庫ftplib的使用方法,詳細(xì)描述了連接與登錄、目錄操作、文件上傳下載、文件管理、目錄列表查看等核心函數(shù),并提供了兩個(gè)實(shí)戰(zhàn)案例,幫助實(shí)現(xiàn)FTP自動(dòng)化操作,需要的朋友可以參考下2026-04-04
django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式
這篇文章主要介紹了django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04

