
影刀RPA Python操作MySQL数据库从连接到增删改查完整实战作者林焱影刀内置的数据库指令只支持SQLite但现实中大多数业务系统用的是MySQL。这篇讲如何在影刀的Python代码块里连接MySQL完成增删改查。准备工作安装MySQL驱动pipinstallpymysqlpymysql是纯Python实现的MySQL驱动不需要安装额外C库Windows下兼容性最好。比mysql-connector-python轻量比MySQLdb好安装。连接模板importpymysql# 连接配置config{host:192.168.1.100,# 数据库IPport:3306,# 端口user:your_username,# 用户名password:your_password,# 密码database:your_database,# 库名[video(video-UCajC8p9-1783622550236)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限)]charset:utf8mb4,# 字符集支持emojiconnect_timeout:10# 连接超时}connectionpymysql.connect(**config)cursorconnection.cursor()查询数据# 查询所有商品sqlSELECT id, name, price, stock FROM products WHERE status %scursor.execute(sql,(active,))resultscursor.fetchall()# results是一个元组列表[ (1, 商品A, 99.00, 100), (2, 商品B, 199.00, 50) ]# 转成字典列表方便后续处理columns[desc[0]fordescincursor.description]data[dict(zip(columns,row))forrowinresults]foritemindata:print(f{item[name]}: ¥{item[price]}库存{item[stock]})注意%s是参数占位符不是字符串格式化。用%s传入参数可以防止SQL注入pymysql会自动转义不要用f-string或%拼接SQL。插入/更新/删除同一模式try:# 插入sqlINSERT INTO products (name, price, stock) VALUES (%s, %s, %s)cursor.execute(sql,(新产品,299.00,50))# 更新sqlUPDATE products SET price %s WHERE id %scursor.execute(sql,(259.00,1))# 删除sqlDELETE FROM products WHERE stock 0cursor.execute(sql)# 提交事务查询不需要commit增删改必须commitconnection.commit()print(f影响行数:{cursor.rowcount})exceptExceptionase:connection.rollback()# 出错回滚print(f操作失败:{e})批量操作影刀数据写入MySQL典型场景影刀采集到1000条商品数据批量写入MySQL# 影刀采集到的数据假设是一个列表products[(商品A,99.00,100),(商品B,199.00,50),# ... 更多数据]sqlINSERT INTO products (name, price, stock) VALUES (%s, %s, %s)cursor.executemany(sql,products)# 一次插入多条connection.commit()print(f成功插入{cursor.rowcount}条)executemany比循环execute快得多因为它把多条数据打包成一次网络往返发送。实战影刀采集 MySQL存储完整流程影刀定时触发 → 影刀采集网页数据 → Python代码块写入MySQL ↓ 影刀定时触发 → Python代码块查询MySQL → 影刀生成报表 → 影刀发送邮件步骤1写入采集流程importpymysql# 从影刀变量拿到采集的数据collected_data[...]# 影刀传入connpymysql.connect(**config)try:withconn.cursor()ascursor:# 先清空今日数据cursor.execute(DELETE FROM daily_sales WHERE date CURDATE())# 批量插入新数据sqlINSERT INTO daily_sales (date, product, sales) VALUES (CURDATE(), %s, %s)cursor.executemany(sql,collected_data)conn.commit()finally:conn.close()步骤2读取报表流程connpymysql.connect(**config)try:withconn.cursor()ascursor:sql SELECT product, SUM(sales) as total FROM daily_sales WHERE date DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY product ORDER BY total DESC cursor.execute(sql)week_datacursor.fetchall()finally:conn.close()# week_data返回给影刀生成周报踩坑实录坑1连接不关闭导致数据库连接数耗尽MySQL默认最大连接数是151。如果每次查询都新建连接但不关闭很快就会耗尽。务必用try/finally关闭连接或者用with语句pymysql的连接支持上下文管理器temu店群自动化报活动案例withpymysql.connect(**config)asconn:withconn.cursor()ascursor:cursor.execute(sql)坑2中文乱码两个地方都要设字符集连接参数里设charsetutf8mb4建表时设DEFAULT CHARSETutf8mb4。utf8mb4支持emojiutf8只支持基本多语言平面BMP。坑3长时间空闲连接被MySQL断开MySQL默认8小时无活动会自动断开连接。如果你的影刀流程两个数据库操作之间隔了很久需要用conn.ping(reconnectTrue)检查连接状态conn.ping(reconnectTrue)# 如果断了自动重连cursorconn.cursor()坑4安全性——密码不要硬编码不要把数据库密码写在Python代码里。用配置文件上一篇文章讲的YAML/INI管理连接参数或者用环境变量importos passwordos.environ.get(DB_PASSWORD,)写在最后MySQL是RPA流程数据持久化的最佳方案。SQLite够轻量但不够强大MySQL才能支撑起真正的业务数据流转。影刀负责从网页把数据拿回来MySQL负责把数据存起来供后续分析——这是一个完整的自动化数据管道。