我们使用nodejs总是难免要连接数据库,通常我们有以下两个选择:
- 使用原生数据库驱动,通过SQL字符串操作数据库
- 使用ORM框架,如typeorm、sequelize等
第一种方式带给我们的好处是方便快捷,原生SQL操作,缺点也是非常多,如安全性问题,迁移困难,跟踪调试不方便等方面的问题;
而第二种方式比较好的解决了上述问题,但是对于比较复杂的查询操作,与SQL比起来,就比较欠缺灵活性了。
现在我多出了另一个选择,lubejs,它有以下特性:
- lubejs仅做语法转译,贴近原生SQL的编程方式
- 良好的typescript语言支持,强大的智能提示与类型检查
- 支持多种驱动(目前仅支持mssql)
- 支持原生字符串片段插入
- 标准CRUD操作支持
- 内置数据库连接池管理
- 代码段式事务管理
Lubejs简介
假设我们有以下表,
【user】
字符名 | 类型 | 描述 |
---|---|---|
name | nvarchar(50) | 用户名,主键 |
nvarchar(100) | 邮箱 | |
descript | nvarchar(100) | 摘要说明 |
【order】
字符名 | 类型 | 描述 |
---|---|---|
username | nvarchar(50) | 用户名 |
orderNo | nvarchar(100) | 订单号 |
item | nvarchar(100) | 物品名称 |
price | decimal(18,6) | 单价 |
quantity | int | 数量 |
descript | nvarchar(100) | 摘要说明 |
对应的typescript类型如下
type User = {
name: string;
email: string;
description?: string;
};
type Order = {
username: string;
orderNo: string;
item: string;
price: number;
quantity: number;
description: string;
}
简介
本文仅对lubejs的特性进行介绍,并不作详细教程,详细使用说明,请查看官方文档。官方推荐使用typescript
语言(因为使用typescript才能完整体验lubejs的强大),以下所有示例均为typescript
语言。
插入记录
我们要插入一个叫张三的用户记录
async function insertZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = insert(userTable).values({
name: '张三',
email: 'zs@abc.com',
description: '通过insert语句插入'
});
// 执行SQL
await db.query(sql);
}
修改记录
我们要将张三的用户记录的description列改为想要的内容
async function updateZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = update(userTable).set({
description: '更新后的想要的内容'
}).where({
name: '张三'
});
// 执行SQL
await db.query(sql);
}
删除
删除不再举例,请在lubejs主页查看
查询(重点)
接下来才是我们最为关注的查询功能,还是从简单说起
【查询所有列】
async function selectZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = select(userTable._).from(userTable).where(userTable.name.eq('张三'));
// 执行SQL
const result = await db.query(sql);
// > select [user].* from [user] where [name] = '张三'
console.log(result.rows);
/***********
[{
name: '张三',
email: 'zs@abc.com',
description: '更新后的想要的内容'
}]
**************/
}
【JSON式查询条件声明】
async function selectZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = select(userTable._).from(userTable).where({
name: '张三'
});
// 执行SQL
const result = await db.query(sql);
// > select [user].* from [user] where [name] = '张三'
console.log(result.rows);
/***********
[{
name: '张三',
email: 'zs@abc.com',
description: '更新后的想要的内容'
}]
**************/
}
【查询指定列】
async function selectZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = select(userTable.name).from(userTable).where({
name: '张三'
});
// 执行SQL
const result = await db.query(sql);
// > select [user].[name] from [user] where [name] = '张三'
console.log(result.rows);
/***********
[{
name: '张三',
}]
**************/
}
【指定列别名】
async function selectZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = select(userTable.name.as('username')).from(userTable).where({
name: '张三'
});
// 执行SQL
const result = await db.query(sql);
// > select [user].[name] as [username] from [user] where [name] = '张三'
console.log(result.rows);
/***********
[{
username: '张三',
}]
**************/
}
【JSON式声明】
async function selectZhangshan() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const sql = select({
username: userTable.name
}).from(userTable).where({
name: '张三'
});
// 执行SQL
const result = await db.query(sql);
// > select [user].[name] from [user] where [name] = '张三'
console.log(result.rows);
/***********
[{
name: '张三',
}]
**************/
}
【关联表查询】
async function selectZhangshanOrders() {
// 声明用户表变量,类型为`User`,表名为`user`
const userTable = table<User>('user');
const orderTable = table<Order>('order');
const sql = select(userTable.email, orderTable._)
.from(orderTable)
.join(userTable, orderTable.username.eq(userTable.name))
.where({
name: '张三'
});
// 执行SQL
const result = await db.query(sql);
console.log(result.rows);
/***********
[{
email: 'zs@abc.com',
username: '张三',
orderNo: '0001',
item: '示例物品',
price: 100,
quantity: 1,
description: '示例'
}]
**************/
}
还有更多高级应用,请自行领会【手动狗头】