☰
影刀RPA实操指南:SQLite进阶——索引、事务与批量性能
2026/9/28 19:49:01 网站建设 项目流程

影刀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才能正确排序求均值![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0e4ed8b7610144169852a40d8b1c72e4.png#pic_center)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 conn=sqlite3.connect(r"C:\rpa_data\goods.db")# 单文件数据库cur=conn.cursor()try:sql="INSERT OR IGNORE INTO goods_price(platform,goods_id,title,price,crawl_date) VALUES(?,?,?,?,?)"cur.executemany(sql,rows)# executemany就是批量插入conn.commit()# 提交事务,全部生效affected=cur.rowcountexceptException:conn.rollback()# 任一条失败,全部回滚affected=0finally: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-Catch,Catch里除了打印日志和回滚,还可以推飞书消息告警。入库失败的数据dump成JSON文件留底,等恢复后用补偿子流程重新插入。定时任务把采集和入库错峰安排,避免同时抢磁盘IO。

工程化规范与调试技巧

调试SQL时先把语句放到数据库工具里跑通再粘回影刀,能省大量试错时间。子流程按"01_建表"、“02_采集”、“03_入库”、"04_导出"编号命名,每个子流程注释写清输入输出变量。数据库文件每天备份一份,改名加日期就行。个人用社区版够,团队协作和商业项目上创业版更省心。

易错速查表

  1. 查询结果取不到值——SELECT结果在变量里,第0行可能是表头数据,先打印整个变量看结构
  2. UPDATE后不知道影响几行——受影响条数在结果变量的第0行第0列,单独取出来打印
  3. 批量插入时快时慢——检查是否逐条INSERT,改成executemany或【数据库批量插入数据】
  4. 重复数据插入报Unique错误——SQL改成INSERT OR IGNORE,配合唯一索引
  5. 数据库文件被锁——另一个流程或工具没关闭连接,全部【关闭数据库】后再跑
  6. 中文乱码——建库时统一UTF-8,Python读写显式指定encoding
  7. 查询突然变慢——数据量过了十万级,给WHERE字段补索引

学习资源与延伸阅读

官方的数据库入门课视频值得看一遍,连接数据库和执行SQL语句两条指令文档里把连接字符串写法讲得很细。我这套"建表+索引+事务批量入库"的完整流程源码我放在代码仓库 home.linyan.cloud,可以直接参考改造。数据沉淀做到SQLite这一步,影刀RPA才算真正从采集工具升级成数据系统。


#影刀RPA #RPA自动化 #SQLite #数据库 #数据处理

作者:林焱

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询