Python 连接 MySQL 数据库

Python 连接 MySQL 数据库

在 python 中连接 MySQL 数据库,最常用、最稳定的方法是使用 PyMySQL 库。

一、准备工作

1.安装 PyMySQL 库
bash 复制代码
pip install pymysql
2.前提条件
  • 本地 / 远程已安装 MySQL 服务
  • 已创建数据库
  • 拥有 MySQL 账号密码
  • 确保 MySQL 端口(默认3306)未被防火墙拦截

二、连接 MySQL

python 复制代码
# 1. 导入pymysql库
import pymysql

# 2. 创建数据库连接(核心代码)
conn = pymysql.connect(
    host="localhost",       # 数据库地址(本地用localhost/127.0.0.1)
    user="root",            # MySQL用户名
    password="123456",      # MySQL密码
    database="test_db",     # 要连接的数据库名
    port=3306,              # MySQL默认端口
    charset="utf8mb4"       # 字符集(支持emoji,推荐)
)

# 3. 创建游标对象(用于执行SQL语句)
cursor = conn.cursor()

# 4. 执行SQL查询语句
sql = "SELECT * FROM user"  # 替换为你的表名
cursor.execute(sql)

# 5. 获取查询结果
# fetchone():获取1条数据 | fetchall():获取所有数据
results = cursor.fetchall()
for row in results:
    print(row)  # 打印每一行数据

# 6. 关闭游标和连接(必须!释放资源)
cursor.close()
conn.close()

三、核心操作

查询:无需提交事务

增 / 删 / 改 :必须执行 conn.commit() 提交事务,否则数据不会生效!

1.插入数据
python 复制代码
import pymysql

conn = pymysql.connect(host="localhost", user="root", password="123456", database="test_db", charset="utf8mb4")
cursor = conn.cursor()

# 插入SQL(占位符 %s 防止SQL注入,推荐写法)
sql = "INSERT INTO user(name, age) VALUES (%s, %s)"
data = ("张三", 20)  # 数据元组

try:
    cursor.execute(sql, data)
    conn.commit()  # 提交事务!
    print("插入成功")
except Exception as e:
    conn.rollback()  # 出错回滚
    print("插入失败:", e)

cursor.close()
conn.close()
2.更新数据
python 复制代码
sql = "UPDATE user SET age=%s WHERE name=%s"
data = (21, "张三")
cursor.execute(sql, data)
conn.commit()
3.删除数据
python 复制代码
sql = "DELETE FROM user WHERE name=%s"
data = ("张三",)
cursor.execute(sql, data)
conn.commit()

四、带异常处理(推荐)

生产环境必须用 try-except-finally 保证连接安全关闭,避免资源泄漏:

python 复制代码
import pymysql
from pymysql import Error

def connect_mysql():
    try:
        # 建立连接
        conn = pymysql.connect(
            host="localhost",
            user="root",
            password="123456",
            database="test_db",
            charset="utf8mb4"
        )
        if conn.open:
            print("数据库连接成功!")
            cursor = conn.cursor()
            
            # 执行查询
            cursor.execute("SELECT VERSION()")
            version = cursor.fetchone()
            print("MySQL版本:", version)

    except Error as e:
        print("数据库连接失败:", e)
    finally:
        # 无论是否出错,都关闭连接
        if 'conn' in locals() and conn.open:
            cursor.close()
            conn.close()
            print("数据库连接已关闭")

if __name__ == "__main__":
    connect_mysql()

参数说明

参数 说明 默认值
host 数据库地址 localhost
user 数据库用户名
password 数据库密码
database 要连接的数据库名
port 端口号 3306
charset 字符集(推荐 utf8mb4) utf8
autocommit 自动提交事务(不推荐) False

五、MySQL 官方驱动

使用 MySQL 官方原生驱动,安装 mysql-connector-python

bash 复制代码
pip install mysql-connector-python

连接代码:

python 复制代码
import mysql.connector
conn = mysql.connector.connect(
	host="localhost",
    user="root",
    password="123456",
    database="test_db"
)

MySQL 数据库连接池

一、安装依赖

bash 复制代码
pip install dbutils pymysql

二、代码演示

python 复制代码
import pymysql
from dbutils.pooled_db import PooledDB

class MySQLPool:
    def __init__(self):
        self.pool = PooledDB(
            creator=pymysql,        # 使用pymysql作为连接驱动
            maxconnections=10,      # 连接池最大连接数
            mincached=2,            # 初始化时至少创建的空闲连接
            maxcached=5,            # 最大空闲连接
            maxshared=3,            # 最大共享连接
            blocking=True,          # 无连接时是否阻塞
            maxusage=None,          # 单个连接最大复用次数
            setsession=[],          # 执行SQL前的会话设置
            ping=0,                 # 自动检查连接可用性

            # 数据库配置
            host="127.0.0.1",
            port=3306,
            user="root",
            password="你的密码",
            database="test_db",
            charset="utf8mb4"
        )

    # 获取连接
    def get_conn(self):
        return self.pool.connection()

    # 查询(单行/多行)
    def query(self, sql, args=None, one=False):
        conn = self.get_conn()
        cur = conn.cursor(pymysql.cursors.DictCursor)  # 返回字典格式
        try:
            cur.execute(sql, args)
            if one:
                return cur.fetchone()
            return cur.fetchall()
        finally:
            cur.close()
            conn.close()  # 归还连接池,不是真关闭

    # 增删改(自动commit)
    def execute(self, sql, args=None):
        conn = self.get_conn()
        cur = conn.cursor()
        try:
            cur.execute(sql, args)
            conn.commit()
            return cur.rowcount
        except Exception as e:
            conn.rollback()
            raise e
        finally:
            cur.close()
            conn.close()

# 全局单例连接池
mysql_pool = MySQLPool()

三、使用示例

python 复制代码
# 查询一条
user = mysql_pool.query("SELECT * FROM user WHERE id=%s", (1,), one=True)
print(user)

# 查询所有
users = mysql_pool.query("SELECT * FROM user")
print(users)

# 插入
rows = mysql_pool.execute("INSERT INTO user(name,age) VALUES(%s,%s)", ("张三", 20))
print("影响行数:", rows)
相关推荐
运维行者_10 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
hhzz11 小时前
基于监控视频的水位尺自动识别技术方案与实现
python·opencv·yolo·图像识别·cv
yongche_shi11 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
国强_dev11 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist12311 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器11 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
weixin_4080996712 小时前
OCR批量识别图片方案:从手动处理到自动化API系统(Python/Java/PHP实战)
图像处理·python·ocr·文字识别·api调用·批量识别·石榴智能
数安3000天12 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
AI行业学习12 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
南墙上的石头13 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql