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://www.couragesteak.com/tcos/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://www.couragesteak.com/tcos/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>
            
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
评论区