美文网首页
如何在javascript/typescript中,Lubejs

如何在javascript/typescript中,Lubejs

作者: Jover | 来源:发表于2021-02-04 09:41 被阅读0次

我们使用nodejs总是难免要连接数据库,通常我们有以下两个选择:

  1. 使用原生数据库驱动,通过SQL字符串操作数据库
  2. 使用ORM框架,如typeorm、sequelize等

第一种方式带给我们的好处是方便快捷,原生SQL操作,缺点也是非常多,如安全性问题,迁移困难,跟踪调试不方便等方面的问题;
而第二种方式比较好的解决了上述问题,但是对于比较复杂的查询操作,与SQL比起来,就比较欠缺灵活性了。

现在我多出了另一个选择,lubejs,它有以下特性:

  • lubejs仅做语法转译,贴近原生SQL的编程方式
  • 良好的typescript语言支持,强大的智能提示与类型检查
  • 支持多种驱动(目前仅支持mssql)
  • 支持原生字符串片段插入
  • 标准CRUD操作支持
  • 内置数据库连接池管理
  • 代码段式事务管理

Lubejs简介

假设我们有以下表,

【user】

字符名 类型 描述
name nvarchar(50) 用户名,主键
email 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: '示例'
    }]
   **************/
}

还有更多高级应用,请自行领会【手动狗头】

相关文章

网友评论

      本文标题:如何在javascript/typescript中,Lubejs

      本文链接:https://www.haomeiwen.com/subject/bncmtltx.html