
影刀RPA实操指南SQLite进阶——索引、事务与批量性能数据量上万之后SQLite查询突然变得要等好几秒批量插入慢到怀疑流程卡死——这是用影刀RPA做数据沉淀的第二个阶段必然遇到的问题。我第一年做电商数据采集时把所有数据都塞Excel行数一多文件打开都要半分钟后来换SQLite做本地库又撞上查询慢、插入慢两个坑研究索引和事务之后百万行级别也能秒级响应。这篇就把索引、事务、批量性能这三件事一次讲透。SQLite是单文件的本地数据库不装服务、不要账号一个.db文件拷走就能用特别适合影刀RPA做本地数据中转站。影刀里操作数据库靠【连接数据库】、【执行SQL语句】、【数据库批量插入数据】、【关闭数据库】这条指令链SQLite也可以直接在【插入代码段(Python)】里用内置的sqlite3模块操作两条路本文都会讲。影刀连接数据库指令链的正确用法【连接数据库】指令用数据库连接字符串创建连接对象并保存成变量后续所有指令都引用这个变量。【执行SQL语句】的查询结果变量类型是list也就是字符串的列表的列表——SELECT返回多行多列结果集UPDATE/INSERT/DELETE则只返回受影响的记录条数这个数字存放在结果变量的第0行第0列取数时别取错了位置。标准四步流程连接数据库执行SQL语句打印日志看结果关闭数据库。最后一步千万别省连接不释放任务跑几天进程就异常了。执行SQL语句面板里还有超时秒数和以文本格式输出两个参数前者防长查询卡死流程后者勾选后每个值转成文本输出写入Excel时格式更干净。建表规范主键和字段类型一步到位建表SQL用【执行SQL语句】跑一次就行。我见过最惨的表是全部字段都用TEXT查价格要现场转数字排序全乱。建表时定好类型后面数据处理能省一半事。-- 建表商品每日价格表在【执行SQL语句】或Python代码段里执行CREATETABLEIFNOTEXISTSgoods_price(idINTEGERPRIMARYKEYAUTOINCREMENT,-- 自增主键platformTEXTNOTNULL,-- 平台taobao/pdd/xhsgoods_idTEXTNOTNULL,-- 商品IDtitleTEXT,-- 商品标题priceREAL,-- 价格REAL才能正确排序求均值crawl_dateTEXTNOTNULL-- 采集日期 yyyy-MM-dd);-- 唯一索引防止同一商品同一天重复写入CREATEUNIQUEINDEXIFNOTEXISTSidx_uniqueONgoods_price(platform,goods_id,crawl_date);IF NOT EXISTS让建表SQL可以每天流程开头无脑执行一次表存在就跳过这是我的固定套路。索引查询从10秒到0.1秒的关键索引就是给常用查询字段建目录。没有索引时WHERE条件要逐行扫描数据到几十万行后明显变慢。在platform、goods_id、crawl_date这三类过滤字段上建索引查询速度是数量级的提升。场景该建索引的字段效果按商品查历史价goods_id秒级出全史按日期拉当日全量crawl_date快10倍以上防重复写入多列唯一索引查询加速去重双效索引不是越多越好每个索引都会拖慢插入速度。我的原则只给WHERE和JOIN里出现的字段建索引一张表控制在3个以内。事务批量写入的正确姿势事务就是把多条SQL打包执行要么全部成功要么全部回滚。逐条INSERT等于每条都要走一次完整提交流程慢且不安全包进一个事务速度能快百倍中途失败还能整体回滚数据不会写一半。【数据库批量插入数据】指令本身就是事务级别的将多组数据一次性插入到一张表中结果为全部正确或全部失败。它的待插入数据参数只支持二维列表比如[[影刀,1], [RPA, 2]]。用Python代码段配合sqlite3的写法是# 插入代码段(Python)事务方式批量插入# 输入rows二维列表如[[taobao,123,商品A,9.9,2026-09-27]]# 输出affected受影响行数importsqlite3 connsqlite3.connect(rC:\rpa_data\goods.db)# 单文件数据库curconn.cursor()try:sqlINSERT OR IGNORE INTO goods_price(platform,goods_id,title,price,crawl_date) VALUES(?,?,?,?,?)cur.executemany(sql,rows)# executemany就是批量插入conn.commit()# 提交事务全部生效affectedcur.rowcountexceptException:conn.rollback()# 任一条失败全部回滚affected0finally:conn.close()# 无论如何都关闭连接INSERT OR IGNORE配合唯一索引重复数据自动跳过不报错流程可以放心重跑这个组合值千金。批量性能优化三个实测有效的参数数据量大到几十万行时还有三个优化点。第一是分批提交一次事务塞50万行内存会吃紧每1万行commit一次最稳影刀【批量插入到数据库】指令里就有对应的单次连接插入数量参数默认10000文档里特别说明如果重复多次连接和断开数据库会导致错误要把这个数值改大一些。第二是插入前临时删索引、插完再建大批量导入时能快好几倍。第三是关闭Python侧的自动提交统一用executemany加commit。优化手段适用数据量预期提升executemany替代逐条1000行以上快50倍以上分批commit10万行以上稳定性大增先删索引再重建50万行以上再快2-3倍SQLite与Excel、数据处理的双向通道SQLite查出来的list结果去掉表头就能直接用写入行数据到表格写进Excel方向反过来则用读取区域数据读Excel转二维列表喂给批量插入。JSON字段解析完再入库字段拆清楚后面用SQL做数据清洗比在Python里写循环舒服得多。元素定位与采集端怎么为数据库让路采集端的责任是产出干净的二维列表用【获取相似元素列表(web)】配合CSS选择器或XPath取文本【ForEach列表循环】遍历拼行。外层【For次数循环】控制页数【等待元素(web)】防懒加载页面结构变了的兜底交给Try-Catch。采集和入库分离成两个子流程中间用SQLite衔接任何一段出问题都能单独重跑。异常处理与系统联动数据库操作全段包Try-CatchCatch里除了打印日志和回滚还可以推飞书消息告警。入库失败的数据dump成JSON文件留底等恢复后用补偿子流程重新插入。定时任务把采集和入库错峰安排避免同时抢磁盘IO。工程化规范与调试技巧调试SQL时先把语句放到数据库工具里跑通再粘回影刀能省大量试错时间。子流程按01_建表、“02_采集”、“03_入库”、04_导出编号命名每个子流程注释写清输入输出变量。数据库文件每天备份一份改名加日期就行。个人用社区版够团队协作和商业项目上创业版更省心。易错速查表查询结果取不到值——SELECT结果在变量里第0行可能是表头数据先打印整个变量看结构UPDATE后不知道影响几行——受影响条数在结果变量的第0行第0列单独取出来打印批量插入时快时慢——检查是否逐条INSERT改成executemany或【数据库批量插入数据】重复数据插入报Unique错误——SQL改成INSERT OR IGNORE配合唯一索引数据库文件被锁——另一个流程或工具没关闭连接全部【关闭数据库】后再跑中文乱码——建库时统一UTF-8Python读写显式指定encoding查询突然变慢——数据量过了十万级给WHERE字段补索引学习资源与延伸阅读官方的数据库入门课视频值得看一遍连接数据库和执行SQL语句两条指令文档里把连接字符串写法讲得很细。我这套建表索引事务批量入库的完整流程源码我放在代码仓库 home.linyan.cloud可以直接参考改造。数据沉淀做到SQLite这一步影刀RPA才算真正从采集工具升级成数据系统。#影刀RPA #RPA自动化 #SQLite #数据库 #数据处理作者林焱