不管你承认与否,Node.js 都是一个后端语言平台。那么,操作数据库,这个后端最为常用的代码逻辑之一,Node.js 自然也需要拥有。我们当然也可以使用数据库驱动直接执行 SQL 语句,但我们往往需要更为高级 SQL 构建方式。Knex.js,为 Node.js 提供了多数据库后端的 SQL 查询构建的能力,可以更加方便地完成数据库查询和操作,并为更为高层次的 ORM 框架提供基础。

Knex.js库

简介

Knex,是 knex 组织在 Github 上开源的 Node.js 的 SQL 查询构建器,项目位于 https://github.com/knex/knex,目前版本为 0.21.5。Knex 灵活轻便,支持多数据库后端,包括 MySQL、MSSQL、PostgreSQL 等,且支持:

  • 数据库事务
  • 连接池化
  • 流式查询
  • 包括 Promise 和回调形式的 API

Knex.js Github

安装

Knex 主要的目标环境的 Node.js,需求 Node.js 10+,可以使用 NPM 进行安装:

$ npm install knex --save

Knex 支持多种数据库后端,需要安装各数据库的驱动:

$ npm install pg$ npm install sqlite3$ npm install mysql$ npm install mysql2$ npm install oracledb$ npm install mssql

示例

安装完成后,在 Node.js 项目中,引入 knex,并初始化客户端实例:

var knex = require('knex')({  client: 'mysql',  connection: {    host : '127.0.0.1',    user : 'your_database_user',    password : 'your_database_password',    database : 'myapp_test'  }});

其中 client 参数为数据库后端类型,而 connection 代表客户端的数据库连接,包括主机、用户名、密码和数据库等。 Knex 使用连接池的方式,优化与数据库的连接性能,使用 pool 参数定义连接池的大小:

var knex = require('knex')({    pool: { min: 0, max: 7 }})

也可以使用 log 参数注册不同等级的日志记录器:

var knex = require('knex')({   log: {    warn(message) {    },    error(message) {    },    deprecate(message) {    },    debug(message) {    },  }});

Knex.js文档

Knex.js 提供了数据库的 DDL 操作,使用 knex.schema 提供的方法实现。创建表,使用 createTable:

knex.schema.createTable('users', function (table) {  table.increments();  table.string('name');  table.timestamps();})

createTable 的回调接受一个 table 参数,使用该 table 定义数据列,如 table.increments 提供了递增的整数 ID 列,table.string 提供了字符串列等,对应的 SQL 语句是:

create table `users` (    `id` int unsigned not null auto_increment primary key,    `name` varchar(255),    `created_at` datetime,    `updated_at` datetime)

对应的提供了 dropTable 和 dropTableIfExists 来实现表的删除:

knex.schema.dropTable('users')knex.schema.dropTableIfExists('users')

并提供了 knex.table 实现表定义的修改:

knex.schema.table('users', function (table) {  table.dropColumn('name');  table.string('first_name');  table.string('last_name');})

Knex 提供了 SQL 查询的构建器。我们来看一个简单的例子:

knex({ a: 'table', b: 'table' })  .select({    aTitle: 'a.title',    bTitle: 'b.title'  })  .whereRaw('?? = ??', ['a.column_1', 'b.column_2'])

查询了两个表 a 和 b,并接 select 条件,进行连表查询。

Knex 最基本的查询构建是 select 方法:

knex.select().from('books')

对应最简单的 select 语句

select * from `books`

在 select 方法中可以提供数据列来查询具体的列:

knex.select('title', 'author', 'year').from('books')

并且,可以串联 where 方法,实现等值条件查询:

knex('users').where({  first_name: 'Test',  last_name:  'User'}).select('id')

Knex.js 提供了 join 方法,实现数据表的 join 查询:

knex('users')  .join('contacts', 'users.id', 'contacts.user_id')  .select('users.id', 'contacts.phone')

Knex.js 还提供了聚合函数:

knex('users').sum('products')

Knex.js 提供了 Promise 形式的异步接口,可以串联所有数据库操作:

// Create a tableknex.schema  .createTable('users', table => {    table.increments('id');    table.string('user_name');  })  // ...and another  .createTable('accounts', table => {    table.increments('id');    table.string('account_name');    table      .integer('user_id')      .unsigned()      .references('users.id');  })  // Then query the table...  .then(() =>    knex('users').insert({ user_name: 'Tim' })  )  // ...and using the insert id, insert into the other table.  .then(rows =>    knex('accounts').insert({ account_name: 'knex', user_id: rows[0] })  )  // Query both of the rows.  .then(() =>    knex('users')      .join('accounts', 'users.id', 'accounts.user_id')      .select('users.user_name as user', 'accounts.account_name as account')  )  // map over the results  .then(rows =>    rows.map(row => {      console.log(row)    })  )  // Finally, add a .catch handler for the promise chain  .catch(e => {    console.error(e);  });

Knex.js 还支持 TypeScript,为数据库操作提供了数据类型:

interface User {  id: number;  name: string;  age: number;}knex('users')  .where('id')  .first(); // Resolves to anyknex('users') // User is the type of row in database  .where('id', 1) // Your IDE will be able to help with the completion of id  .first(); // Resolves to User | undefined

SQL数据库

总结

Knex.js 作为一个 Node.js 的 SQL 查询构建器,为 JS 提供了多数据库后端的操作,并提供了丰富的数据库操作和查询功能,使得开发者不必手动编写 SQL 语句,进而使用更为高级的 JS 方法进行查询的构建,为更为高层次的 ORM 框架提供了可靠的数据库操作,是一个质量较高的 Node.js 数据库相关的基础库。

SQL数据库

bootstrap3 表单构建器_Knex - 灵活轻便的 Node.js SQL 查询构建器相关推荐

  1. bootstrap3 表单构建器_FastReport.NET报表设计器连接到OracleDB关系数据库

    首先,您可以使用ODBC连接器.但是它充满了很多设置. FastReport.NET报表设计器连接到OracleDB关系数据库 如您所见,您需要创建数据源及其连接字符串.动作比较多. 此方法的替代方法 ...

  2. Node.js 系列:构建原生 Node.js 应用

    原生 Node.js 应用 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效 Nod ...

  3. node.js 组件_使用Node.js和TransloadIt构建用户头像组件

    node.js 组件 在本系列的第一部分中,我们介绍了TransloadIt -一种文件处理服务,专门处理图像,视频和音频. 如果您还没有阅读它,我建议您立即阅读,因为它涵盖了很多背景概念,您需要阅读 ...

  4. 使用Node.js和TransloadIt构建用户头像组件

    在本系列的第一部分中,我们介绍了TransloadIt -一种文件处理服务,专门处理图像,视频和音频. 如果您还没有阅读它,我建议您立即阅读,因为它涵盖了很多背景概念,您需要阅读这些概念才能继续阅读本 ...

  5. slack 使用说明_如何使用Node.js为Slack构建Meetupbot

    slack 使用说明 by premprakashsingh 通过premprakashsingh 如何使用Node.js为Slack构建Meetupbot (How to build a Meetu ...

  6. Bootstrap3 表单控件的状态

    控件的状态 在表单的使用过程中,每个控件可能都会有很多状态,通过表单控件的状态,可以给用户或访问者提供一些有用的反馈. Bootstrap为表单控件提供了 4 种状态,分别是获得焦点状态.禁用状态.只 ...

  7. Bootstrap3 表单静态控件

    静态控件 在表单中,当你需要在一个label元素的后面放置纯文本时,请在 <p>元素上添加.form-control-static类.如: <form class="for ...

  8. Bootstrap3 表单支持的控件

    支持的控件 Bootstrap支持所有的标准表单控件,包括 input 控件.textarea 控件.checkbox 和 radio 控件.select 控件等. 1.input 控件 Bootst ...

  9. Bootstrap3 表单

    表单 Bootstrap 为表单和表单控件提供了一些全局样式,不需要添加任何辅助类,即可让表单使用默认布局.默认布局中,表单元素采用垂直布局,标签和输入框采用顶对齐方式. Bootstrap 中创建表 ...

最新文章

  1. 他676分考上清华却没微信,看到他的手机后大家沉默了
  2. Python集成网络诊断小工具(含有ping,tracert,tcping等小工具)
  3. 5款常见原型工具,产品特色知多少?
  4. LDAP 配置 ldap_bind: Invalid credentials (49)
  5. 贝叶斯统计:Tweedie公式及其证明
  6. 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)
  7. Majority Element(169) Majority Element II(229)
  8. js程序中美元符号$是什么
  9. github图---小章鱼图标
  10. go语言io reader_Go语言中的io.Reader和io.Writer以及它们的实现
  11. vue NoData
  12. 算法不会,尚能饭否之排序——折半插入排序(Binary Insert Sort)
  13. 凯立德地图导航2020年最新版_曾是导航领域“领头羊”的凯立德,如今为何岌岌可危?...
  14. displaytag用法一
  15. 软件工程教程:第3章需求分析 课后习题
  16. 时间复杂度和空间复杂度OvO
  17. xxl子任务_XXL-JOB(1) 分布式任务系统选型和XXL-JOB介绍
  18. 数据建模 --- 概念建模+逻辑建模+物理建模
  19. 【定位问题】基于matlab TDOA+taylor算法移动基站无源定位【含Matlab源码 2098期】
  20. storm如何部署拓扑

热门文章

  1. 大家都在学C语言吧,作为程序员这有一个问题,秃顶算工伤吗?
  2. win10——戴尔笔记本电脑插上耳机没有声音电脑外放
  3. 商品租赁系统(Java_类/接口/继承/多态)
  4. JAVA 调用地图API
  5. 基于ssm的校园二手电子交易平台
  6. 一、自定义一个竖直Layout
  7. WebRTC源码研究(47)WebRCT传输非音视频数据
  8. rtmp一些状态信息详解-as连接FMS服务器报错状态汇总~~
  9. 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
  10. 零基础如何入门学习电脑编程?