阿里云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天前
|
数据采集 运维 监控
雅虎拍卖自动化竞拍系统开发:预约出价、防误拍、价格风控、自动兜底方案
本文系统复盘日淘跨境全链路技术实践:涵盖双模式出价风控、物流智能分流、清关合规申报、订单幂等防重、多平台数据聚合及全链路溯源等10大核心场景,提供可运行代码与商业化方案对比,助力轻资产创业高效落地。(239字)
47 0
|
5天前
|
人工智能 安全 网络安全
Hermes Agent 进阶教程:技能自进化、MoA 模型委员会与多后端部署实战
Hermes Agent 是 Nous Research 开源的自我改进型 AI 智能体(MIT 协议),首创内置学习闭环:自主创建技能、使用中持续优化、跨会话构建用户画像。截至2026年7月2日,GitHub Star 20.7万,v0.18.0版新增 /learn 技能蒸馏、双层记忆治理、MoA模型委员会、/goal 证据化完成判定等六大进阶能力,支持本地/Docker/SSH/Modal 等安全后端部署。(239字)
176 1
|
14天前
|
缓存 NoSQL 关系型数据库
故障复盘|阿里云Redis缓存穿透引发跨境接口高频报错问题优化
Taocarts跨境系统因高频无效请求导致缓存穿透,数据库压力剧增。通过空值缓存(5分钟)、Redis布隆过滤器拦截非法ID及前置强校验三重防护,无效查询下降90%,彻底解决穿透问题,接口稳定性显著提升。(238字)
63 0
|
1天前
|
存储 前端开发 JavaScript
阿里云OSS对象存储!前端JS无后端直传文件完整代码实战
阿里云OSS前端JS直传方案,无需后端中转,支持图片/文件直传、自定义路径与权限控制。附完整可运行代码及OSS跨域、权限、CDN等关键配置,高效稳定,解放服务器压力,是Web/小程序/后台上传的最佳实践。(239字)
98 0
|
2天前
|
Devops 测试技术 API
跨境电商系统的自动化测试与CI/CD流水线构建
本项目聚焦自动化测试与DevOps实践,为一站式日淘平台(支持雅虎代拍、煤炉自动代拍等)构建全链路质量保障体系:覆盖单元、集成、E2E及性能测试,采用Pytest/Playwright/Locust,CI/CD基于GitHub Actions,覆盖率门禁≥80%。(239字)
23 0
|
2天前
|
数据采集 缓存 运维
跨境海外网络延时优化实战:跨域接口超时、抖动、重试最优方案
本文针对日本代购、雅虎竞拍等跨境场景的高延时、抖动、超时问题,提出分层优化方案:差异化超时、指数退避重试、幂等设计与本地缓存兜底,并附可运行Python代码。实测接口成功率从87%提升至99.5%+。(239字)
96 0
|
5天前
|
缓存 前端开发 JavaScript
阿里云CDN缓存优化!代码解决静态资源更新延迟问题
阿里云CDN缓存优化方案:通过版本号(?v=xxx)、Cache-Control头及动态刷新脚本,精准控制静态资源缓存时效;配合CDN控制台策略(JS/CSS缓存24h、HTML仅10min),实现自动刷新、零手动清缓存,兼顾加载速度与更新实时性。
48 0
|
5天前
|
弹性计算 监控 测试技术
阿里云压测工具!Python多线程脚本实现接口高并发压力测试
项目上线前需压力测试验证接口并发、服务器及数据库承载力。本方案结合阿里云压测平台与自研Python脚本,支持万级并发模拟,自动统计成功率、耗时、QPS等指标,快速定位超时、DB瓶颈等问题,保障系统稳定上线。(239字)
44 0
|
7天前
|
人工智能 自然语言处理 API
阿里云通义千问API!Python极简代码实现智能问答与文案生成
通义千问是阿里云自研大模型,原生适配全生态,接口稳定、成本低、免复杂部署。本文提供30行极简Python代码,快速实现智能问答、文案创作与代码纠错,直连DashScope API,零门槛接入FC/ECS等服务,助力开发者低成本落地AI功能。(239字)
237 0
|
12天前
|
数据采集 NoSQL 调度
日本电商多平台数据聚合系统:Scrapy + Redis分布式架构设计
本文介绍基于Scrapy+Redis的分布式爬虫系统,专为日本代购、一站式日淘(含雅虎代拍、北极星日淘)设计,支持雅虎拍卖、煤炉、乐天等多平台数据聚合。架构含Master调度与多Worker节点,集成Redis去重、MongoDB/Elasticsearch存储,日均稳定采集50万+条,可用率99.5%。(239字)
73 0