1 前言
PyMySQL 是一个纯 Python 编写的库,用于连接 MySQL 数据库并执行 SQL 操作。它完全遵循 DB-API 2.0 标准,适合用于各种 Python 应用程序中与 MySQL 数据库进行交互。由于它不依赖于底层 C 扩展,因此在环境配置和移植性方面非常方便。
安装
pip install pymysql==1.1.1
2 创建表
通用类封装,请见文章末尾。
"""
@file: test3.py
@author: 有勇气的牛排
@url: www.couragesteak.com
@description:
"""
from mysql.pymysql_test.MySQLHandler import MySQLHandler
if __name__ == "__main__":
db = MySQLHandler(
host='127.0.0.1',
port=3306,
user='root',
password='root',
database='cs_test'
)
create_table_sql = """
CREATE TABLE IF NOT EXISTS article (
id INT AUTO_INCREMENT PRIMARY KEY,
ac_id INT,
title VARCHAR(255),
content VARCHAR(255),
a_info VARCHAR(255)
)
"""
db.execute(create_table_sql)
db.close()

3 增删改查
3.1 增加数据
3.1.1 增加多条数据
insert_sql = "INSERT INTO article (ac_id, title, content, a_info) VALUES (%s, %s, %s, %s)"
users_data = [
(1, "Python教程", '这是文章正文部分', '文章描述'),
(1, "Python教程", '这是文章正文5%部分', '文章{}描述'),
]
db.executemany(insert_sql, users_data)
关于单条查询,自己可以探索。
3.2 删除数据
a_id = 1
delete_sql = f"DELETE FROM article WHERE id = {a_id}"
db.execute(delete_sql)
3.3 修改数据
a_id = 1
content = "这是文章正文部分, 测试5%"
update_sql = f"UPDATE article SET content='{content}' WHERE id = {a_id}"
db.execute(update_sql)
3.4 查询数据
a_id = 3
select_sql = f"SELECT * FROM article WHERE id = {a_id}"
results = db.execute(select_sql)
print("查询结果:", results)

4 通用类封装
import pymysql
class MySQLHandler:
"""
MySQL 数据库操作类
"""
def __init__(self, host, port, user, password, database, charset='utf8mb4'):
"""
初始化数据库连接
"""
self.db_config = {
'host': host,
'port': port,
'user': user,
'password': password,
'database': database,
'charset': charset
}
self.connection = None
self.connect()
def connect(self):
"""
建立数据库连接
"""
try:
self.connection = pymysql.connect(**self.db_config)
print("数据库连接成功!")
except Exception as e:
print(f"数据库连接失败:{e}")
self.connection = None
def execute(self, sql, params=None):
"""
执行单条 SQL 语句
:param sql: SQL 语句
:param params: 可选的参数列表
:return: 受影响的行数或查询结果
"""
if not self.connection:
print("数据库未连接!")
return None
try:
with self.connection.cursor() as cursor:
cursor.execute(sql, params)
if sql.strip().lower().startswith("select"):
return cursor.fetchall()
else:
self.connection.commit()
return cursor.rowcount
except Exception as e:
print(f"执行 SQL 失败:{e}")
self.connection.rollback()
return None
def executemany(self, sql, param_list):
"""
批量执行 SQL 语句
:param sql: SQL 语句
:param param_list: 参数列表
:return: 受影响的行数
"""
if not self.connection:
print("数据库未连接!")
return None
try:
with self.connection.cursor() as cursor:
cursor.executemany(sql, param_list)
self.connection.commit()
return cursor.rowcount
except Exception as e:
print(f"批量执行 SQL 失败:{e}")
self.connection.rollback()
return None
def close(self):
"""
关闭数据库连接
"""
if self.connection:
self.connection.close()
print("数据库连接已关闭!")
5 总结
在MySQLHandler通用类上层,仍然可以进行进一步封装,比如插入数据、更新数据前传入字典数据,然后转化为sql语句,这样上层操作也会更加方便。
<h2><a id="1__0"></a>1 前言</h2>
<p>PyMySQL 是一个纯 Python 编写的库,用于连接 MySQL 数据库并执行 SQL 操作。它完全遵循 DB-API 2.0 标准,适合用于各种 Python 应用程序中与 MySQL 数据库进行交互。由于它不依赖于底层 C 扩展,因此在环境配置和移植性方面非常方便。</p>
<p>安装</p>
<pre><div class="hljs"><code class="lang-shell">pip install pymysql==1.1.1
</code></div></pre>
<h2><a id="2__10"></a>2 创建表</h2>
<p>通用类封装,请见文章末尾。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-string">"""
@file: test3.py
@author: 有勇气的牛排
@url: www.couragesteak.com
@description:
"""</span>
<span class="hljs-keyword">from</span> mysql.pymysql_test.MySQLHandler <span class="hljs-keyword">import</span> MySQLHandler
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
<span class="hljs-comment"># 数据库配置</span>
db = MySQLHandler(
host=<span class="hljs-string">'127.0.0.1'</span>,
port=<span class="hljs-number">3306</span>,
user=<span class="hljs-string">'root'</span>,
password=<span class="hljs-string">'root'</span>,
database=<span class="hljs-string">'cs_test'</span>
)
<span class="hljs-comment"># 创建表</span>
create_table_sql = <span class="hljs-string">"""
CREATE TABLE IF NOT EXISTS article (
id INT AUTO_INCREMENT PRIMARY KEY,
ac_id INT,
title VARCHAR(255),
content VARCHAR(255),
a_info VARCHAR(255)
)
"""</span>
db.execute(create_table_sql)
<span class="hljs-comment"># 关闭数据库</span>
db.close()
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/0db766ab8e3dd636a303ffa0a3160aee.png" alt="PyMSQL创建表" /></p>
<h2><a id="3__53"></a>3 增删改查</h2>
<h3><a id="31__55"></a>3.1 增加数据</h3>
<h4><a id="311__57"></a>3.1.1 增加多条数据</h4>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 插入数据</span>
insert_sql = <span class="hljs-string">"INSERT INTO article (ac_id, title, content, a_info) VALUES (%s, %s, %s, %s)"</span>
users_data = [
(<span class="hljs-number">1</span>, <span class="hljs-string">"Python教程"</span>, <span class="hljs-string">'这是文章正文部分'</span>, <span class="hljs-string">'文章描述'</span>),
(<span class="hljs-number">1</span>, <span class="hljs-string">"Python教程"</span>, <span class="hljs-string">'这是文章正文5%部分'</span>, <span class="hljs-string">'文章{}描述'</span>),
]
db.executemany(insert_sql, users_data)
</code></div></pre>
<p>关于单条查询,自己可以探索。</p>
<h3><a id="32__71"></a>3.2 删除数据</h3>
<pre><div class="hljs"><code class="lang-python">a_id = <span class="hljs-number">1</span>
delete_sql = <span class="hljs-string">f"DELETE FROM article WHERE id = <span class="hljs-subst">{a_id}</span>"</span>
db.execute(delete_sql)
</code></div></pre>
<h3><a id="33__79"></a>3.3 修改数据</h3>
<pre><div class="hljs"><code class="lang-python">a_id = <span class="hljs-number">1</span>
content = <span class="hljs-string">"这是文章正文部分, 测试5%"</span>
update_sql = <span class="hljs-string">f"UPDATE article SET content='<span class="hljs-subst">{content}</span>' WHERE id = <span class="hljs-subst">{a_id}</span>"</span>
db.execute(update_sql)
</code></div></pre>
<h3><a id="34__88"></a>3.4 查询数据</h3>
<pre><div class="hljs"><code class="lang-python">a_id = <span class="hljs-number">3</span>
select_sql = <span class="hljs-string">f"SELECT * FROM article WHERE id = <span class="hljs-subst">{a_id}</span>"</span>
results = db.execute(select_sql)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"查询结果:"</span>, results)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/58999646472b6b6a0948bf12bffefcad.png" alt="PyMSQ查询数据" /></p>
<h2><a id="4__99"></a>4 通用类封装</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> pymysql
<span class="hljs-keyword">class</span> <span class="hljs-title class_">MySQLHandler</span>:
<span class="hljs-string">"""
MySQL 数据库操作类
"""</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, host, port, user, password, database, charset=<span class="hljs-string">'utf8mb4'</span></span>):
<span class="hljs-string">"""
初始化数据库连接
"""</span>
self.db_config = {
<span class="hljs-string">'host'</span>: host,
<span class="hljs-string">'port'</span>: port,
<span class="hljs-string">'user'</span>: user,
<span class="hljs-string">'password'</span>: password,
<span class="hljs-string">'database'</span>: database,
<span class="hljs-string">'charset'</span>: charset
}
self.connection = <span class="hljs-literal">None</span>
self.connect()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">connect</span>(<span class="hljs-params">self</span>):
<span class="hljs-string">"""
建立数据库连接
"""</span>
<span class="hljs-keyword">try</span>:
self.connection = pymysql.connect(**self.db_config)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"数据库连接成功!"</span>)
<span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"数据库连接失败:<span class="hljs-subst">{e}</span>"</span>)
self.connection = <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">execute</span>(<span class="hljs-params">self, sql, params=<span class="hljs-literal">None</span></span>):
<span class="hljs-string">"""
执行单条 SQL 语句
:param sql: SQL 语句
:param params: 可选的参数列表
:return: 受影响的行数或查询结果
"""</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.connection:
<span class="hljs-built_in">print</span>(<span class="hljs-string">"数据库未连接!"</span>)
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">try</span>:
<span class="hljs-keyword">with</span> self.connection.cursor() <span class="hljs-keyword">as</span> cursor:
cursor.execute(sql, params)
<span class="hljs-keyword">if</span> sql.strip().lower().startswith(<span class="hljs-string">"select"</span>):
<span class="hljs-keyword">return</span> cursor.fetchall()
<span class="hljs-keyword">else</span>:
self.connection.commit()
<span class="hljs-keyword">return</span> cursor.rowcount
<span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"执行 SQL 失败:<span class="hljs-subst">{e}</span>"</span>)
self.connection.rollback()
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">executemany</span>(<span class="hljs-params">self, sql, param_list</span>):
<span class="hljs-string">"""
批量执行 SQL 语句
:param sql: SQL 语句
:param param_list: 参数列表
:return: 受影响的行数
"""</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.connection:
<span class="hljs-built_in">print</span>(<span class="hljs-string">"数据库未连接!"</span>)
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">try</span>:
<span class="hljs-keyword">with</span> self.connection.cursor() <span class="hljs-keyword">as</span> cursor:
cursor.executemany(sql, param_list)
self.connection.commit()
<span class="hljs-keyword">return</span> cursor.rowcount
<span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"批量执行 SQL 失败:<span class="hljs-subst">{e}</span>"</span>)
self.connection.rollback()
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">close</span>(<span class="hljs-params">self</span>):
<span class="hljs-string">"""
关闭数据库连接
"""</span>
<span class="hljs-keyword">if</span> self.connection:
self.connection.close()
<span class="hljs-built_in">print</span>(<span class="hljs-string">"数据库连接已关闭!"</span>)
</code></div></pre>
<h2><a id="5__187"></a>5 总结</h2>
<p>在MySQLHandler通用类上层,仍然可以进行进一步封装,比如插入数据、更新数据前传入字典数据,然后转化为sql语句,这样上层操作也会更加方便。</p>
留言