
影刀RPA新手教程数据库连接实战指南——查询批量插入与五个常见报错我第一次用影刀把采集到的电商数据存入MySQL数据库时遇到了连接超时的问题。排查了一下午才发现是因为网络不稳定需要设置read_timeout参数。后来我总结了数据库连接的完整用法和5个常见报错的处理方法现在操作数据库基本不会报错。连接数据库MySQL/SQLite连接配置MySQL连接配置方法1用影刀指令连接指令连接数据库 连接方式数据库连接字符串 连接字符串DSNMySQL;SERVER127.0.0.1;PORT3306;DATABASEtest_db;USERroot;PASSWORD123456;CHARSETutf8 保存到db_obj方法2用Python代码连接import pymysql def main(args): conn pymysql.connect(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8, read_timeout600) # 设置读取超时时间为600秒 return conn我踩过的坑连接MySQL时中文乱码是因为字符编码设置不对。解决方法是在连接字符串中加上CHARSETutf8或者用charsetutf8参数。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_resultquery_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(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8) 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语句 SQLINSERT INTO products (name, price, sales) VALUES ( product[0] , product[1] , product[2] ) 保存到insert_sql 指令执行SQL语句 数据库连接对象db_obj SQL语句insert_sql 超时时间20秒缺点每条数据都要执行一次SQL效率低字符串拼接SQL有SQL注入风险如果数据中有特殊字符比如单引号会导致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(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8) 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(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8) ...操作数据库... conn.close() # 关闭连接我踩过的坑没有关闭数据库连接导致连接数耗尽新的连接无法建立。解决方法是在流程结束前一定要执行【关闭数据库】指令。5个常见报错与解决方法报错1连接超时Lost connection to MySQL server during query原因网络不稳定或者查询的数据量太大导致连接超时。解决方法方法1设置read_timeout参数import pymysql def main(args): conn pymysql.connect(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8, read_timeout600) # 设置读取超时时间为600秒 return conn方法2分批查询数据不要一次性查询10万条数据分批查询比如每次查询1000条。def batch_query(conn, batch_size1000): 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在连接字符串中设置字符编码指令连接数据库 连接字符串DSNMySQL;SERVER127.0.0.1;PORT3306;DATABASEtest_db;USERroot;PASSWORD123456;CHARSETutf8方法2在Python代码中使用charset参数import pymysql def main(args): conn pymysql.connect(host127.0.0.1, port3306, userroot,  password123456, dbtest_db, charsetutf8) # 使用utf8编码 return conn我踩过的坑数据库表的字符集是gbk但是连接用的是utf8导致中文乱码。解决方法是确保数据库表、数据库连接、Python代码三者的字符集一致。报错3SQL注入风险字符串拼接SQL的危险原因用字符串拼接SQL语句比如sql SELECT * FROM products WHERE name product_name 如果product_name的值是 OR 11就会导致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(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8) 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(host127.0.0.1, port3306, userroot, password123456, dbtest_db, charsetutf8) ...操作数据库... except Exception as e: print(e) finally: if conn: conn.close() # 确保连接一定会被关闭我的一般做法使用【数据库批量插入数据】指令因为这个指令会自动管理连接不需要手动关闭。案例主线把采集的电商数据批量存入MySQL数据库场景从网页上采集电商数据商品名称、价格、销量然后批量存入MySQL数据库。完整流程1. 连接MySQL数据库 - 指令连接数据库 - 连接字符串DSNMySQL;SERVER127.0.0.1;PORT3306;DATABASEecommerce;USERroot;PASSWORD123456;CHARSETutf8 - 保存到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]) 条数据关键点连接数据库时要设置正确的字符编码避免中文乱码批量插入数据要用【数据库批量插入数据】指令不要用循环构建SQL流程结束前要关闭数据库连接避免连接数耗尽12大模块覆盖检查认识影刀/安装【连接数据库】指令的使用元素定位四合一不需要元素定位数据库操作是后台操作变量与数据类型保存查询结果、保存待插入数据流程控制for循环批量插入数据、if判断插入是否成功网页自动化从网页采集数据本文的前提数据处理查询数据→处理→插入数据库本文核心鼠标键盘图像自动化不需要数据库操作是后台操作进阶技能用Python代码操作数据库pymysql、sqlite3平台实战可以把数据库中的数据展示到home.linyan.cloud我搭建的一个数据展示页面系统联动数据库操作是系统联动的一部分工程化与规范数据库操作的规范关闭连接、提交事务、参数化查询速查表/常见报错连接超时Lost connection to MySQL server during query字符编码问题中文乱码SQL注入风险字符串拼接SQL的危险事务未提交插入后查不到数据连接未关闭连接数耗尽速查表数据库连接方式的选择数据库类型连接方式优先级MySQL影刀指令连接 或 Python代码连接最高最常用SQLitePython代码连接高适合小项目| SQL Server | 影刀指令连接 | 中企业环境 || Oracle | 影刀指令连接 | 低大型项目 |速查表数据插入方式的选择插入方式使用场景优点缺点优先级循环构建SQL不推荐无效率低、有SQL注入风险、特殊字符处理复杂最低批量INSERT影刀指令批量插入数据效率高、不需要写代码需要掌握指令用法最高批量INSERTPython代码插入数据量特别大10万条以上效率最高、可以自定义处理逻辑需要写Python代码高我总结的数据库连接黄金法则连接数据库时要设置正确的字符编码避免中文乱码永远不要用字符串拼接SQL语句一定要用参数化查询避免SQL注入插入数据后要提交事务执行conn.commit()数据才会真正写入数据库流程结束前要关闭数据库连接避免连接数耗尽批量插入数据要用【数据库批量插入数据】指令不要用循环构建SQL效率低且有安全风险查询大量数据时要分批查询不要一次性查询10万条数据避免连接超时常见报错与解决方法补充报错6数据库表字符集和连接字符集不一致原因数据库表的字符集是gbk但是连接用的是utf8导致中文乱码。解决方法确保数据库表、数据库连接、Python代码三者的字符集一致。- 查看数据库表字符集SHOW CREATE TABLE products; - 修改数据库表字符集ALTER TABLE products CONVERT TO CHARACTER SET utf8; - 连接数据库时使用正确的字符集charsetutf8报错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中比较高级的功能但是非常有用特别是需要把采集到的数据持久化存储的时候。我建议先在小范围测试不要一上来就插入10万条数据先插入10条把流程调通多用【打印日志】指令记录插入了多少条数据、是否有报错方便排查问题批量插入数据要用【数据库批量插入数据】指令不要用循环构建SQL流程结束前要关闭数据库连接避免连接数耗尽如果你在实践过程中遇到问题可以访问home.linyan.cloud查看我整理的更多案例和解决方案。内容标签影刀RPA 数据库连接 MySQL SQLite 批量插入 常见报错 新手教程作者林焱