☰
影刀RPA新手教程:数据库连接实战指南——查询批量插入与五个常见报错
2026/10/8 7:06:41 网站建设 项目流程

影刀RPA新手教程:数据库连接实战指南——查询批量插入与五个常见报错

我第一次用影刀把采集到的电商数据存入MySQL数据库时,遇到了连接超时的问题。排查了一下午才发现是因为网络不稳定,需要设置read_timeout参数。后来我总结了数据库连接的完整用法和5个常见报错的处理方法,现在操作数据库基本不会报错。

连接数据库:MySQL/SQLite连接配置

MySQL连接配置

方法1:用影刀指令连接

指令:连接数据库 连接方式:数据库连接字符串 连接字符串:DSN=MySQL;SERVER=127.0.0.1;PORT=3306;DATABASE=test_db;USER=root;PASSWORD=123456;CHARSET=utf8 保存到:db_obj

方法2:用Python代码连接

import pymysql def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8', read_timeout=600) # 设置读取超时时间为600秒 return conn

我踩过的坑:连接MySQL时中文乱码,是因为字符编码设置不对。解决方法是在连接字符串中加上CHARSET=utf8,或者用charset='utf8'参数。

SQLite连接配置

用Python代码连接:

import sqlite3 def main(args): conn = sqlite3.connect('D:\test.db') # SQLite数据库文件路径 return conn

关键点:SQLite是文件型数据库,不需要安装MySQL服务器,适合小项目或者单机应用。

查询数据:SELECT→读取结果

用影刀指令查询

指令:执行SQL语句 数据库连接对象:db_obj SQL语句:SELECT * FROM products WHERE price > 100 超时时间:20秒 保存到:query_result

query_result的结构:是一个二维列表,每一行数据是一个列表。

[['商品A', 150, 100], ['商品B', 200, 200], ['商品C', 120, 150]]

遍历查询结果:

指令:for每个循环 列表:query_result 循环变量:row 指令:获取列表指定位置项 目标列表:row 索引:0 保存到:product_name 指令:获取列表指定位置项 目标列表:row 索引:1 保存到:price ...处理数据...

用Python代码查询

import pymysql def query_data(conn): cursor = conn.cursor() sql = "SELECT * FROM products WHERE price > %s" cursor.execute(sql, (100,)) # 使用参数化查询,避免SQL注入 result = cursor.fetchall() return result def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8') result = query_data(conn) print(result) conn.close()

我第一次做的时候:用字符串拼接SQL语句,比如sql = "SELECT * FROM products WHERE name = '" + product_name + "'",这样有SQL注入风险。后来改成参数化查询cursor.execute(sql, (product_name,)),才解决这个问题。

批量插入:循环构建SQL vs 批量INSERT

方法1:循环构建SQL(不推荐)

指令:for每个循环 列表:product_list 循环变量:product 指令:构建SQL语句 SQL:INSERT INTO products (name, price, sales) VALUES ('" + product[0] + "', " + product[1] + ", " + product[2] + ")" 保存到:insert_sql 指令:执行SQL语句 数据库连接对象:db_obj SQL语句:insert_sql 超时时间:20秒

缺点:

  1. 每条数据都要执行一次SQL,效率低
  2. 字符串拼接SQL有SQL注入风险
  3. 如果数据中有特殊字符(比如单引号),会导致SQL语法错误

方法2:批量INSERT(推荐)

用影刀指令批量插入:

指令:数据库批量插入数据 连接方式:数据库连接对象 数据库连接对象:db_obj 数据库插入语句:INSERT INTO products (name, price, sales) VALUES (?, ?, ?) 待插入数据:product_list # 二维列表,如[['商品A', 150, 100], ['商品B', 200, 200]]

用Python代码批量插入:

import pymysql def batch_insert(conn, data): cursor = conn.cursor() sql = "INSERT INTO products (name, price, sales) VALUES (%s, %s, %s)" cursor.executemany(sql, data) # 批量插入 conn.commit() # 提交事务 def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8') data = [['商品A', 150, 100], ['商品B', 200, 200]] batch_insert(conn, data) conn.close()

我的一般做法:优先用【数据库批量插入数据】指令,因为不需要写Python代码,而且效率更高。如果插入的数据量特别大(比如10万条),就用Python代码的executemany方法。

关闭连接

用影刀指令关闭连接:

指令:关闭数据库 数据库连接对象:db_obj

用Python代码关闭连接:

def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8') ...操作数据库... conn.close() # 关闭连接

我踩过的坑:没有关闭数据库连接,导致连接数耗尽,新的连接无法建立。解决方法是在流程结束前,一定要执行【关闭数据库】指令。

5个常见报错与解决方法

报错1:连接超时(Lost connection to MySQL server during query)

原因:网络不稳定,或者查询的数据量太大,导致连接超时。

解决方法:

方法1:设置read_timeout参数

import pymysql def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8', read_timeout=600) # 设置读取超时时间为600秒 return conn

方法2:分批查询数据

不要一次性查询10万条数据,分批查询,比如每次查询1000条。

def batch_query(conn, batch_size=1000): cursor = conn.cursor() offset = 0 while True: sql = "SELECT * FROM products LIMIT %s OFFSET %s" cursor.execute(sql, (batch_size, offset)) result = cursor.fetchall() if not result: break ...处理数据... offset += batch_size

报错2:字符编码问题(中文乱码)

原因:数据库连接没有设置正确的字符编码,导致中文显示为乱码。

解决方法:

方法1:在连接字符串中设置字符编码

指令:连接数据库 连接字符串:DSN=MySQL;SERVER=127.0.0.1;PORT=3306;DATABASE=test_db;USER=root;PASSWORD=123456;CHARSET=utf8

方法2:在Python代码中使用charset参数

import pymysql def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4331e1bbba394e1e9dcfa952e4089c05.png#pic_center) password='123456', db='test_db', charset='utf8') # 使用utf8编码 return conn

我踩过的坑:数据库表的字符集是gbk,但是连接用的是utf8,导致中文乱码。解决方法是确保数据库表、数据库连接、Python代码三者的字符集一致。

报错3:SQL注入风险(字符串拼接SQL的危险)

原因:用字符串拼接SQL语句,比如sql = "SELECT * FROM products WHERE name = '" + product_name + "'",如果product_name的值是' OR '1'='1,就会导致SQL注入。

解决方法:使用参数化查询

import pymysql def query_data(conn, product_name): cursor = conn.cursor() # 不安全的方式(不要这样做) # sql = "SELECT * FROM products WHERE name = '" + product_name + "'" # 安全的方式(参数化查询) sql = "SELECT * FROM products WHERE name = %s" cursor.execute(sql, (product_name,)) result = cursor.fetchall() return result

我的一般做法:永远不要用字符串拼接SQL语句,一定要用参数化查询。

报错4:事务未提交(插入后查不到数据)

原因:插入数据后没有执行conn.commit(),导致数据没有真正写入数据库。

解决方法:插入数据后执行conn.commit()

import pymysql def insert_data(conn, data): cursor = conn.cursor() sql = "INSERT INTO products (name, price, sales) VALUES (%s, %s, %s)" cursor.execute(sql, data) conn.commit() # 提交事务,数据才会真正写入数据库 def main(args): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8') insert_data(conn, ['商品A', 150, 100]) conn.close()

我第一次遇到这个问题时:插入数据后查不到,排查了一下午才发现是没有执行conn.commit()。后来在每次插入数据后都加上conn.commit(),才解决这个问题。

报错5:连接未关闭(连接数耗尽)

原因:流程结束后没有关闭数据库连接,导致连接数耗尽,新的连接无法建立。

解决方法:

方法1:在流程结束前关闭连接

指令:关闭数据库 数据库连接对象:db_obj

方法2:使用try…finally确保连接一定会被关闭

import pymysql def main(args): conn = None try: conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test_db', charset='utf8') ...操作数据库... except Exception as e: print(e) finally: if conn: conn.close() # 确保连接一定会被关闭

我的一般做法:使用【数据库批量插入数据】指令,因为这个指令会自动管理连接,不需要手动关闭。

案例主线:把采集的电商数据批量存入MySQL数据库

场景:从网页上采集电商数据(商品名称、价格、销量),然后批量存入MySQL数据库。

完整流程:

1. 连接MySQL数据库 - 指令:连接数据库 - 连接字符串:DSN=MySQL;SERVER=127.0.0.1;PORT=3306;DATABASE=ecommerce;USER=root;PASSWORD=123456;CHARSET=utf8 - 保存到:db_obj 2. 创建表(如果表不存在) - 指令:执行SQL语句 - 数据库连接对象:db_obj - SQL语句:CREATE TABLE IF NOT EXISTS products (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), price DECIMAL(10,2), sales INT) - 超时时间:20秒 3. 循环采集电商数据(假设已经采集到列表product_list中) - 指令:for每个循环 - 列表:product_list - 循环变量:product 4. 批量插入数据 - 指令:数据库批量插入数据 - 连接方式:数据库连接对象 - 数据库连接对象:db_obj - 数据库插入语句:INSERT INTO products (name, price, sales) VALUES (?, ?, ?) - 待插入数据:product_list 5. 关闭数据库连接 - 指令:关闭数据库 - 数据库连接对象:db_obj 6. 验证数据是否插入成功 - 指令:执行SQL语句 - 数据库连接对象:db_obj - SQL语句:SELECT COUNT(*) FROM products - 超时时间:20秒 - 保存到:count_result - 指令:打印日志 - 内容:"成功插入" + str(count_result[0][0]) + "条数据"

关键点:

  1. 连接数据库时要设置正确的字符编码,避免中文乱码
  2. 批量插入数据要用【数据库批量插入数据】指令,不要用循环构建SQL
  3. 流程结束前要关闭数据库连接,避免连接数耗尽

12大模块覆盖检查

  1. 认识影刀/安装:【连接数据库】指令的使用
  2. 元素定位四合一:不需要元素定位(数据库操作是后台操作)
  3. 变量与数据类型:保存查询结果、保存待插入数据
  4. 流程控制:for循环批量插入数据、if判断插入是否成功
  5. 网页自动化:从网页采集数据(本文的前提)
  6. 数据处理:查询数据→处理→插入数据库(本文核心)
  7. 鼠标键盘图像自动化:不需要(数据库操作是后台操作)
  8. 进阶技能:用Python代码操作数据库(pymysql、sqlite3)
  9. 平台实战:可以把数据库中的数据展示到home.linyan.cloud(我搭建的一个数据展示页面)
  10. 系统联动:数据库操作是系统联动的一部分
  11. 工程化与规范:数据库操作的规范(关闭连接、提交事务、参数化查询)
  12. 速查表/常见报错:
    • 连接超时(Lost connection to MySQL server during query)
    • 字符编码问题(中文乱码)
    • SQL注入风险(字符串拼接SQL的危险)
    • 事务未提交(插入后查不到数据)
    • 连接未关闭(连接数耗尽)

速查表:数据库连接方式的选择

数据库类型连接方式优先级
MySQL影刀指令连接 或 Python代码连接最高(最常用)
SQLitePython代码连接高(适合小项目)

| SQL Server | 影刀指令连接 | 中(企业环境) |
| Oracle | 影刀指令连接 | 低(大型项目) |

速查表:数据插入方式的选择

插入方式使用场景优点缺点优先级
循环构建SQL不推荐无效率低、有SQL注入风险、特殊字符处理复杂最低
批量INSERT(影刀指令)批量插入数据效率高、不需要写代码需要掌握指令用法最高
批量INSERT(Python代码)插入数据量特别大(10万条以上)效率最高、可以自定义处理逻辑需要写Python代码高

我总结的数据库连接黄金法则

  1. 连接数据库时要设置正确的字符编码:避免中文乱码
  2. 永远不要用字符串拼接SQL语句:一定要用参数化查询,避免SQL注入
  3. 插入数据后要提交事务:执行conn.commit(),数据才会真正写入数据库
  4. 流程结束前要关闭数据库连接:避免连接数耗尽
  5. 批量插入数据要用【数据库批量插入数据】指令:不要用循环构建SQL,效率低且有安全风险
  6. 查询大量数据时要分批查询:不要一次性查询10万条数据,避免连接超时

常见报错与解决方法(补充)

报错6:数据库表字符集和连接字符集不一致

原因:数据库表的字符集是gbk,但是连接用的是utf8,导致中文乱码。

解决方法:确保数据库表、数据库连接、Python代码三者的字符集一致。

- 查看数据库表字符集:SHOW CREATE TABLE products; - 修改数据库表字符集:ALTER TABLE products CONVERT TO CHARACTER SET utf8; - 连接数据库时使用正确的字符集:charset='utf8'

报错7:插入的数据中含有特殊字符(比如单引号)

原因:用字符串拼接SQL语句,如果数据中含有单引号,会导致SQL语法错误。

解决方法:使用参数化查询,不需要处理特殊字符。

# 不安全的方式(不要这样做) sql = "INSERT INTO products (name) VALUES ('" + product_name + "')" # 如果product_name是"商品's A",会导致SQL语法错误 # 安全的方式(参数化查询) sql = "INSERT INTO products (name) VALUES (%s)" cursor.execute(sql, (product_name,)) # 不需要处理特殊字符

最后的建议

数据库连接是影刀RPA中比较高级的功能,但是非常有用,特别是需要把采集到的数据持久化存储的时候。我建议:

  1. 先在小范围测试:不要一上来就插入10万条数据,先插入10条,把流程调通
  2. 多用【打印日志】指令:记录插入了多少条数据、是否有报错,方便排查问题
  3. 批量插入数据要用【数据库批量插入数据】指令:不要用循环构建SQL
  4. 流程结束前要关闭数据库连接:避免连接数耗尽

如果你在实践过程中遇到问题,可以访问home.linyan.cloud查看我整理的更多案例和解决方案。


内容标签:影刀RPA 数据库连接 MySQL SQLite 批量插入 常见报错 新手教程

作者:林焱

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

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

立即咨询