有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
本文介绍云压测 SQL 数据库的脚本编排方法,用于云压测支持 SQL 语言的关系型数据库(如 MySQL 等)。

基本用法

使用 pts/sql API 提供的接口,您可创建连接 SQL 数据库的客户端,发送 DDL 和 DML 请求,对数据库做基本的增删改查等操作。

数据库连接

建立数据库连接可调用 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 调试功能,快速验证结果是否符合预期。
更多详情,可参见 调试场景