阿里云PolarDB MySQL版Python SDK实战——实现数据增删改查与连接池优化

简介: 本文详解阿里云PolarDB MySQL版的Python开发实战:涵盖环境配置、基础CRUD操作与高并发连接池优化(基于DBUtils),提供完整可运行代码及安全、性能优化建议,助力开发者快速上手云原生数据库开发。(239字)

阿里云PolarDB是一种云原生关系型数据库,兼容MySQL、PostgreSQL等主流数据库协议,具备高可用、高并发、弹性扩容等特性,适用于电商、金融、社交等各类高负载业务场景。本文将围绕PolarDB MySQL版,使用Python SDK实现数据的增删改查(CRUD)核心操作,并针对高并发场景优化实现数据库连接池,附上完整代码示例与实战优化建议,帮助开发者快速上手PolarDB开发。
首先完成开发准备工作:1. 在阿里云控制台创建PolarDB MySQL版集群,获取数据库连接地址、端口、用户名、密码;2. 配置数据库白名单,将本地开发IP或函数计算的内网IP加入白名单,允许外部访问;3. 在Python环境中安装MySQL连接驱动,推荐使用PyMySQL,通过pip命令安装:pip install PyMySQL DBUtils,其中DBUtils用于实现数据库连接池,提升连接复用效率。
首先实现基础的数据库连接与CRUD操作,核心是通过PyMySQL建立数据库连接,执行SQL语句,处理查询结果与异常。以下是基础CRUD的代码示例,包含用户表的创建、用户信息的新增、查询、更新、删除等操作:
import pymysql
from pymysql.cursors import DictCursor

配置PolarDB MySQL连接信息

POLARDB_CONFIG = {
"host": "pc-xxxxxx.mysql.polaradb.aliyuncs.com", # 替换为你的PolarDB连接地址
"port": 3306, # PolarDB MySQL默认端口
"user": "your_username", # 替换为数据库用户名
"password": "your_password", # 替换为数据库密码
"database": "test_db", # 替换为你的数据库名称
"charset": "utf8mb4",
"autocommit": True, # 自动提交事务
"cursorclass": DictCursor # 返回字典格式的查询结果
}

def get_db_connection():
"""获取数据库连接"""
try:
conn = pymysql.connect(**POLARDB_CONFIG)
print("成功连接到PolarDB MySQL数据库")
return conn
except pymysql.MySQLError as e:
print(f"数据库连接失败:{e.args[0]} - {e.args[1]}")
return None

def create_user_table():
"""创建用户表"""
conn = get_db_connection()
if not conn:
return False
try:
with conn.cursor() as cursor:

        # 定义创建表的SQL语句
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS users (
            id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
            name VARCHAR(50) NOT NULL COMMENT '用户名',
            age INT COMMENT '用户年龄',
            email VARCHAR(100) UNIQUE COMMENT '用户邮箱',
            create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
            update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
        """
        cursor.execute(create_table_sql)
        print("用户表创建成功(或已存在)")
        return True
except pymysql.MySQLError as e:
    print(f"创建用户表失败:{e.args[0]} - {e.args[1]}")
    return False
finally:
    if conn:
        conn.close()  # 关闭数据库连接

def add_user(name, age, email):
"""新增用户信息"""
conn = get_db_connection()
if not conn:
return False, "数据库连接失败"
try:
with conn.cursor() as cursor:

        # 定义插入SQL语句
        insert_sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s);"
        affected_rows = cursor.execute(insert_sql, (name, age, email))
        if affected_rows > 0:
            user_id = cursor.lastrowid
            return True, f"新增用户成功,用户ID:{user_id}"
        else:
            return False, "新增用户失败,无数据插入"
except pymysql.MySQLError as e:
    err_msg = f"新增用户失败:{e.args[0]} - {e.args[1]}"
    print(err_msg)
    return False, err_msg
finally:
    if conn:
        conn.close()

def get_user_by_id(user_id):
"""根据用户ID查询用户信息"""
conn = get_db_connection()
if not conn:
return None, "数据库连接失败"
try:
with conn.cursor() as cursor:
select_sql = "SELECT * FROM users WHERE id = %s;"
cursor.execute(select_sql, (user_id,))
user = cursor.fetchone()
if user:
return user, "查询成功"
else:
return None, f"用户ID {user_id} 不存在"
except pymysql.MySQLError as e:
err_msg = f"查询用户失败:{e.args[0]} - {e.args[1]}"
print(err_msg)
return None, err_msg
finally:
if conn:
conn.close()

def update_user(user_id, **kwargs):
"""更新用户信息"""
conn = get_db_connection()
if not conn:
return False, "数据库连接失败"
try:

    # 构建更新字段与参数
    update_fields = []
    params = []
    for key, value in kwargs.items():
        if key in ["name", "age", "email"]:  # 仅允许更新指定字段
            update_fields.append(f"{key} = %s")
            params.append(value)
    params.append(user_id)
    if not update_fields:
        return False, "未指定需要更新的字段"
    update_sql = f"UPDATE users SET {', '.join(update_fields)} WHERE id = %s;"
    with conn.cursor() as cursor:
        affected_rows = cursor.execute(update_sql, params)
        if affected_rows > 0:
            return True, "用户信息更新成功"
        else:
            return False, f"用户ID {user_id} 不存在或无字段更新"
except pymysql.MySQLError as e:
    err_msg = f"更新用户失败:{e.args[0]} - {e.args[1]}"
    print(err_msg)
    return False, err_msg
finally:
    if conn:
        conn.close()

def delete_user(user_id):
"""删除用户信息"""
conn = get_db_connection()
if not conn:
return False, "数据库连接失败"
try:
with conn.cursor() as cursor:
delete_sql = "DELETE FROM users WHERE id = %s;"
affected_rows = cursor.execute(delete_sql, (user_id,))
if affected_rows > 0:
return True, "用户信息删除成功"
else:
return False, f"用户ID {user_id} 不存在"
except pymysql.MySQLError as e:
err_msg = f"删除用户失败:{e.args[0]} - {e.args[1]}"
print(err_msg)
return False, err_msg
finally:
if conn:
conn.close()

测试基础CRUD操作

if name == "main":

# 创建用户表
create_user_table()
# 新增用户
add_result, add_msg = add_user("张三", 25, "zhangsan@example.com")
print(add_msg)
# 查询用户
user, query_msg = get_user_by_id(1)
print(query_msg, user)
# 更新用户
update_result, update_msg = update_user(1, age=26, email="zhangsan_new@example.com")
print(update_msg)
# 删除用户
delete_result, delete_msg = delete_user(1)
print(delete_msg)

在高并发业务场景中,频繁创建和关闭数据库连接会导致性能瓶颈,此时需要使用数据库连接池优化连接管理。DBUtils是Python中常用的数据库连接池工具,分为PersistentDB(线程专用连接池)和PooledDB(线程共享连接池),本文使用PooledDB实现连接池,实现连接复用,减少连接创建开销。
以下是基于连接池的优化代码,替换基础的连接获取方式,实现连接池的初始化、连接获取与释放:
import pymysql
from pymysql.cursors import DictCursor
from DBUtils.PooledDB import PooledDB

配置PolarDB MySQL连接信息(同基础操作)

POLARDB_CONFIG = {
"host": "pc-xxxxxx.mysql.polaradb.aliyuncs.com",
"port": 3306,
"user": "your_username",
"password": "your_password",
"database": "test_db",
"charset": "utf8mb4",
"autocommit": True,
"cursorclass": DictCursor
}

初始化数据库连接池

pool = PooledDB(
creator=pymysql, # 使用的数据库驱动
maxconnections=10, # 连接池最大连接数
mincached=2, # 初始化时连接池中至少创建的空闲连接数
maxcached=5, # 连接池中最多闲置的连接数
maxshared=3, # 连接池中最多共享的连接数
blocking=True, # 连接数达到最大时,是否阻塞等待
maxusage=None, # 单个连接最多被使用的次数,None表示无限制
setsession=[], # 初始化连接时执行的SQL语句
ping=0, # 检查连接可用性的方式,0表示不检查
**POLARDB_CONFIG
)

def get_db_connection_from_pool():
"""从连接池获取数据库连接"""
try:
conn = pool.connection() # 从连接池获取连接
print("从连接池成功获取数据库连接")
return conn
except Exception as e:
print(f"从连接池获取连接失败:{str(e)}")
return None

基于连接池的新增用户函数(其他CRUD函数可同理修改)

def add_user_with_pool(name, age, email):
"""使用连接池新增用户信息"""
conn = get_db_connection_from_pool()
if not conn:
return False, "从连接池获取连接失败"
try:
with conn.cursor() as cursor:
insert_sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s);"
affected_rows = cursor.execute(insert_sql, (name, age, email))
if affected_rows > 0:
user_id = cursor.lastrowid
return True, f"新增用户成功,用户ID:{user_id}"
else:
return False, "新增用户失败,无数据插入"
except pymysql.MySQLError as e:
err_msg = f"新增用户失败:{e.args[0]} - {e.args[1]}"
print(err_msg)
return False, err_msg
finally:
if conn:
conn.close() # 将连接归还到连接池,而非真正关闭

测试连接池操作

if name == "main":
create_user_table() # 先创建用户表

# 使用连接池新增多个用户
for i in range(5):
    name = f"测试用户{i+1}"
    email = f"test{i+1}@example.com"
    result, msg = add_user_with_pool(name, 20+i, email)
    print(msg)
# 使用连接池查询用户
user, msg = get_user_by_id(2)
print(msg, user)

在实际开发中,还需要注意以下优化与安全事项:1. 连接池参数需要根据业务并发量进行调整,maxconnections不宜过大或过小,避免资源浪费或连接不足;2. 使用参数化SQL语句,避免SQL注入攻击,本文中所有SQL语句均使用参数化方式,提升安全性;3. 配置PolarDB的读写分离,针对查询请求路由到只读节点,提升查询性能;4. 引入数据库事务,针对多步操作(如转账、订单创建),保证数据一致性;5. 收集数据库慢查询日志,使用阿里云DMS工具分析慢查询,优化SQL语句与表结构。
阿里云PolarDB MySQL版兼容MySQL协议,开发者可以快速将现有MySQL应用迁移到PolarDB,无需修改大量代码。通过连接池优化,能够有效提升高并发场景下的数据库性能,减少连接开销。后续可结合PolarDB的弹性扩容、自动备份、高可用等特性,构建稳定、高效的数据库服务,支撑各类业务的发展。

阿里云PolarDB #MySQL #Python SDK #数据库连接池 #CRUD实战

目录
相关文章
|
2月前
|
人工智能 缓存 开发框架
阿里云Qwen3.7-Max限时优惠:5折起,输入6元/每百万tokens,输出18元/每百万tokens
Qwen3.7-Max是通义千问面向智能体时代的旗舰大模型,在编程能力(Code Arena全球第二)、智能体执行、长程推理及多语言理解等维度均达行业顶尖水平,支持1M token超长上下文、35小时长周期自主执行及1158次工具调用,已在蔚来汽车工程中验证AI代码生成占比超70%。当前限时5折,输入6元/百万tokens、输出18元/百万tokens,全模型通用节省计划低至4.5折,新用户还可享100万免费tokens(90天有效)。无论开发者探索AI编程,还是企业构建智能体系统,Qwen3.7-Max都是当下高性价比的全能之选。
|
2月前
|
Linux 开发者 iOS开发
Docker 要慌了?苹果开源 Container,Mac 原生容器时代来了!
一年前苹果发布Containerization框架并开源Container工具,现迎来1.0正式版!它为每个容器分配独立轻量VM,依托Apple Silicon与Virtualization.framework,兼顾启动速度与虚拟机级隔离。Mac开发者终于迎来原生容器新选择。(239字)
382 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
数据清洗怎么做?一文讲清十大数据清洗常用方法!
AI落地成败,关键在数据质量!本文系统梳理数据清洗十大核心方法:缺失值智能填补、重复数据识别、异常值处置、标准化/归一化、连续变量离散化、文本深度清洗、类型统一转换、多源数据对齐、特征筛选构造、敏感信息脱敏。直击企业AI项目卡点,助你夯实AI地基。
|
3月前
|
人工智能 算法 自动驾驶
能力第一!阿里云稳居IDC混合云AI智算平台评估领导者象限
近日,国际权威研究机构IDC,发布《IDC MarketScape:中国混合云AI智算平台2025年厂商评估》报告,基于战略与能力双维度对相关厂商进行评估。阿里云凭借大规模智算集群实践经验、全栈AI技术能力、开放协同的生态体系优势,稳居领导者象限。
365 0
|
10月前
|
人工智能 架构师
2025灯塔工厂咨询服务商综合实力榜:十大引路者深度解析与选型指南
在全球制造业转型关键期,灯塔工厂成为企业韧性与价值创造的试金石。本文基于战略规划、技术整合、运营优化与行业协同四大维度,权威盘点2025年度十大灯塔工厂咨询服务商,助力企业甄选真正契合的“引路人”,实现从技术应用到战略落地的全面跃迁。
464 1
|
5月前
|
人工智能
告别单打独斗:Qoder 开启 AI 编程的“多 Agent 团队作战”时代
3月26日14:00-17:20,阿里巴巴数字生态创新园7号楼321暮雪阁,聚焦AI编程实战:Qoder团队协作开发、Spec/Harness/Agent进阶、CLI构建AI-Native应用及ROI提升经验分享。新手与高手皆宜,速报名!
449 0
|
10月前
|
Linux 网络安全 Docker
盘古栈云,创建带ssh服务的linux容器
创建带ssh服务的linux容器
493 146
|
7月前
|
数据采集 人工智能 JSON
告别乱码与数据丢失!揭秘MinerU-HTML:大模型预训练的“数据解密大师”
MinerU-HTML提出“语义采集”新范式,通过双路HTML处理与小模型序列标注,精准提取网页正文,保留代码、公式等关键结构,显著提升大模型训练语料质量,推动数据清洗进入智能化时代。
1621 2
|
7月前
|
自然语言处理 网络协议 安全
开发者如何集成IP查询功能?主流IP离线库全面解读与性能对比
本文聚焦开发者IP查询功能集成需求,对比IP数据云、IPinfo、IP2Location等主流IP离线库的覆盖范围、精度、性能等核心维度,提供选型与集成指南,助力金融、政企等场景高效落地,凸显高精度、高可用性的离线库价值。
|
7月前
|
人工智能 运维 安全
【深度复盘】AI智能体运营工程师就业班实战笔记:Python在Coze中的硬核应用
本文基于AI智能体运营工程师实战,解析Agent、Coze、插件与Python的协同机制,揭示大模型在逻辑计算中的局限。通过手把手开发“企业级密码生成插件”,演示如何用Python弥补AI“随机数幻觉”缺陷,实现精确逻辑控制。关键词:AI智能体, Python, Coze, 插件开发, 自动化运维(238字)
449 0