ali-mysql-client:为nodejs访问mysql数据库提供强大流畅的api的工具类库,目标是希望访问数据库逻辑都能使用一行代码完成,让访问数据库变得更加简单优雅。
1. 初始化配置
在线安装
npm i ali-mysql-client
初始化如下
const DbClient = require('ali-mysql-client'); const db = new DbClient({ host : '127.0.0.1', user : 'root', password : 'secret', database : 'my_db' });
不同框架的使用示例:
2. 构造查询
- 2.1 查询单个值
// 查询单个值,比如下面例子返回的是数字51,满足条件的数据条数 const result = await db .select("count(1)") .from("page") .where("name", "测试", "like") .queryValue();
- 2.2 查询单条数据
// 查询单条数据,返回的是 result = {id:12, name: '测试页面', ....} const result = await db .select("*") .from("page") .where("id", 12) // id = 12 .queryRow();
- 2.3 查询多条数据
// 查询多条数据 返回的是 ressult = [{...}, {...}]; const result = await db .select("*") .from("page") .where("name", "测试页面", 'like') // name like '%测试页面%' .queryList();
- 2.4 服务端分页查询
// 查询多条数据(服务端分页) 返回的是 ressult = {total: 100, rows:[{...}, {...}]}; const result = await db .select("*") .from("page") .where("id", 100, "lt") // id < 100 .queryListWithPaging(3, 20); //每页 20 条,取第 3 页
- 2.5 多表关联查询
// 多表关联查询 const result = await db .select("a.page_id, a.saga_key") .from("page_edit_content as a") .join("left join page as b on b.id = a.page_id") .where("b.id", 172) .queryList();
- 2.6 查询除了支持各种多表join外,当然还支持groupby orderby having等复杂查询操作
const result = await db .select("a1 as a, b1 as b, count(c) as count") .from("table") .where("date", db.literals.now, "lt") // date < now() .where("creator", "huisheng.lhs") // creator = 'huisheng.lhs" .groupby("a1, b1") .having("count(category) > 10") .orderby("id desc") .queryListWithPaging(2); //默认每页20条,取第2页
- 2.7 转为sql自己处理
const result = await db .select('id') .from('page') .where('id', 100) .toSql(); expect(result).toBe('select id from page where `id` = 100');
3. 构造插入
const task = { action: "testA", description: "desc1", state: "123", result: "result1" }; // 插入一条数据 const result = await db .insert("task", task) .execute(); // 也支持直接写字段,支持增加字段 const result = await db .insert("task") .column("action", "test") .column("create_time", db.literals.now) .execute(); // 插入多条数据 const tasks = [ task1, taks2, task3 ]; const result = await db .insert("task", tasks) .execute(); // 支持增加或覆盖字段 const result = await db .insert("task", tasks) .column('create_time', db.literals.now) // 循环赋值给每一行数据 .column('create_user', 'huisheng.lhs') .execute();
4. 构造更新
const task = { action: "testA", description: "desc1", state: "123", result: "updateResult" }; //更新数据 const result = await db .update("task", task) .where("id", 1) .execute(); //更新数据,支持增加字段 const result = await db .update("task") .column("action", "test-id22") .column("create_time", db.literals.now) .where('id', 2) .execute(); // 字面量使用 db.literals.now 等价于 db.literal("now()") const result = await db .update("task") .column("count", db.literal("count + 1")) .column("create_time", db.literal("now()")) .where('id', 2) .execute();
5. 构造删除
//删除id为1的数据 const result = await db .delete("task") .where("id", 1) .execute();
6. 自定义SQL
// 执行自定义SQL const result = await db .sql('select id from page where `id` = ?') .params([ 100 ]) .execute();
7. 事务控制
const trans = await db.useTransaction(); try { // 数据库操作 // await trans.insert(...) // await trans.update(...) await trans.commit(); } catch (e) { await trans.rollback(); }
更多查看 官方教程
使用node查询数据库 (MySql) 时间类型字段返回日期格式不对的解决方式
只需在数据库配置文件里添加timezone: "08:00"
,重启就可以了。不需要手动转换时间格式