本文介绍云压测 SQL 数据库的脚本编排方法,用于云压测支持 SQL 语言的关系型数据库(如 MySQL 等)。
基本用法
数据库连接
建立数据库连接可调用
new sql.Database(driverName: string, dataSourceName: string)
方法。其中,driverName
参数用于指定数据库驱动程序,
dataSourceName
参数用于指定数据源。脚本示例如下:
import sql from 'pts/sql';const db = new sql.Database(sql.MySQL, "user:passwd@tcp(ip:port)/database")export default function () {// 向数据库发送请求}
说明:
若数据库表中带有日期或时间字段,建立数据库连接时,建议在连接串中加入 parserTime 参数(例如:
user:passwd@tcp(ip:port)/database?parseTime=true
),避免时间解析出错。建议将上述建立数据库连接的语句,作为全局变量放在主函数外部(如上述示例),以供同一个 VU 在迭代执行主函数时能够复用连接,避免多次重复创建数据库连接,带来不必要的资源消耗。
SQL 查询
SQL 查询可调用
db.query(sql string)
方法,返回符合条件的数据库记录数组。其中,sql
参数代表传入的 SQL 查询语句。脚本示例如下:
import sql from 'pts/sql';const db = new sql.Database(sql.MySQL, "user:passwd@tcp(ip:port)/database")export default function () {let rows = db.query("SELECT * FROM user");console.log(JSON.stringify(rows)); // [{"id":1,"name":"zhangsan","age":23},{"id":2,"name":"lisi","age":2}]}
SQL 执行
SQL 执行可调用
db.exec(sql string)
方法,传入执行语句,返回本次执行对数据库的影响(返回字段包括:最后插入行的 ID、所有受影响的行数)。db.exec
方法支持常见的 DDL 命令(如 create, drop, alter)和常见的 DML 命令(如 insert,update,delete)。其中,
sql
参数代表传入的 SQL 执行语句。脚本示例如下:
import sql from 'pts/sql';const db = new sql.Database(sql.MySQL, "user:passwd@tcp(ip:port)/database")export default function () {// 修改数据let result = db.exec("UPDATE user SET age=? WHERE name='zhangsan'", Math.floor(Math.random() * 100));console.log(JSON.stringify(result)); // {"lastInsertId":0,"rowsAffected":1}// 插入数据let result = db.exec("insert into user (name, age) values ('wanger', 18)");console.log(JSON.stringify(result)); // {"lastInsertId":66,"rowsAffected":1}
脚本示例
一个包含数据库基本操作及检查点使用的完整脚本示例如下:
import sql from 'pts/sql';import { sleep, check } from 'pts';const db = new sql.Database(sql.MySQL, "user:passwd@tcp(ip:port)/database")export default function () {// 查询数据let rows = db.query("SELECT * FROM user");console.log(JSON.stringify(rows)); // [{"id":1,"name":"zhangsan","age":23},{"id":2,"name":"lisi","age":2}]// 新增数据let result = db.exec("insert into user (name, age) values ('wanger', 18)");console.log(JSON.stringify(result)); // {"lastInsertId":66,"rowsAffected":1}// 删除数据let result = db.exec("delete from user where id > 8");console.log(JSON.stringify(result)); // {"lastInsertId":0,"rowsAffected":2}// 修改数据let result = db.exec("UPDATE user SET age=? WHERE name='zhangsan'", Math.floor(Math.random() * 100));console.log(JSON.stringify(result)); // {"lastInsertId":0,"rowsAffected":1}// 设置检查点check("1 row returned", () => result.rowsAffected === 1);sleep(1)}
结果验证
若要验证脚本执行结果,可在正式压测前,先使用 PTS 调试功能,快速验证结果是否符合预期。