【教程】从零开始学Knex系列:一、安装和使用

注意:本文所有的代码实例都是运行在 express + mysql 的环境下。

前言

Knex是一个用于Node.js的SQL查询构建器和查询执行器。它提供了一种简洁、流畅的方式来编写和执行SQL查询,同时允许开发人员使用数据库的不同方言和特定功能。

Knex支持多种流行的关系型数据库,如MySQL、PostgreSQL、SQLite和Oracle等。它提供了一套API,用于构建和执行复杂的SQL查询,包括选择、插入、更新和删除等操作。开发人员可以使用链式调用来构建查询,通过方法调用来指定查询的条件、排序、限制和连接等。

除了查询构建功能,Knex还提供了一些其他有用的特性,如事务支持、数据库迁移管理以及与异步流程的集成等。它还可以与许多流行的Node.js框架和工具进行集成,如Express、Koa和Bookshelf等。

快速开始

安装

bash 复制代码
# 安装 knex
npm install knex

# 安装 mysql数据库驱动
npm install mysql2

配置

src/config/dbConfig.js 文件下新建 Knex 配置文件,内容如下:

js 复制代码
module.exports = {
  development: {
    client: 'mysql2',
    connection: {
      host: 'localhost',
      user: 'root',
      password: '123456',
      database: 'knex_db'
    }
  },
  production: {
	...
  }
};

src/app.js 文件中引入 dbConfig.js 配置,代码如下:

js 复制代码
const express = require('express');
const knex = require('knex');
const dbConfig = require('./config/dbConfig.js');

const app = express();

// 根据配置创建一个 Knex 实例
const db = knex(dbConfig.development);

// 示例路由处理程序
app.get('/users', (req, res) => {
  // 使用 Knex 进行查询
  db.select('*').from('users')
    .then(users => {
      res.json(users);
    })
    .catch(error => {
      res.status(500).json({ error: 'An error occurred' });
    });
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

以上就是 Knex 的配置和最简单实用。

Schema 模式

Knex 中,"schema" 是指用于定义和管理数据库表结构的功能。

Knexschema 功能提供了一组方法,用于创建和修改数据库表、列、约束等元数据。

Knexschema 提供主要功能:

  • 创建表和列:你可以使用 Knex 创建新的数据库表,并定义表中的列及其数据类型、长度、约束等信息。
  • 修改表结构:Knex 允许你对已存在的表进行修改,包括添加、修改或删除列,更改列的数据类型、长度和约束等。
  • 创建和管理索引:你可以使用 Knex 在表上创建索引,以提高查询性能。
  • 创建和管理约束:Knex 提供了创建和管理约束的方法,如主键约束、唯一约束、外键约束等。
  • 数据库迁移:Knex 的 schema 功能与数据库迁移密切相关。你可以使用 Knex 迁移工具来管理数据库的版本控制和迁移脚本,以便在不同环境中保持数据库结构的一致性和可迁移性。

Knexschema 功能提供的相当完善,有兴趣的可以自行到官网查阅,这里只做几个简单的演示。

官网地址:knexjs.org/guide/schem...

创建表

下面我们将使用 knexschema 创建一个数据表,表的名称是 users,有4个字段:id、name、email以及隐式时间戳「created_at、updated_at」这两个字段。

其中主键是 id 字段并且引入调用了primary()函数,会自动开启自增长功能。email自动被设置了唯一性并且不能为空,name字段不能为空。

js 复制代码
const kenx = require('kenx');
const dbConfig = require('./config/dbConfig.js');
const db = knex(dbConfig.development);

// 创建表
db.schema.createTable('users', table => {
  table.increments('id').primary();
  table.string('name', 255).notNullable();
  table.string('email', 255).unique().notNullable();
  table.timestamps(true, true);
}).then(() => {
  console.log('Table created successfully');
}).catch(error => {
  console.error('Error creating table:', error.message);
});

Knex 提供的字段类型函数如下:

  1. integer():整数
  2. float():浮点数
  3. decimal():十进制数
  4. boolean():布尔值
  5. date():日期
  6. dateTime():日期时间
  7. time():时间
  8. timestamp():时间戳
  9. string():字符串
  10. text():文本
  11. json():JSON
  12. binary():二进制数
  13. uuid():UUID

创建索引和约束

js 复制代码
// 创建索引
db.schema.alterTable('users', table => {
  table.index('email');
}).then(() => {
  console.log('Index created successfully');
}).catch(error => {
  console.error('Error creating table:', error.message);
})

// 创建约束
db.schema.alterTable('users', table => {
  table.unique('email');
})
.then(() => {
  console.log('Constraint created successfully');
})
.catch(error => {
  console.error('Error creating constraint:', error.message);
})

删除表

js 复制代码
// 删除表
async function dropTable(tableName) {
    try {
        await db.schema.dropTableIfExists(tableName);
        console.log('table dropped successfully.');
    } catch (error) {
        console.error('table drop failed: ', error.message);
    }
}

// 调用删除 users 表
dropTable('users');

总结

Knex是一个强大而灵活的SQL查询构建器,使开发人员可以以一种简单、一致的方式与不同的关系型数据库进行交互。它简化了数据库查询的编写和执行过程,提供了更高层次的抽象,同时保留了灵活性和可扩展性。

本文简单演示了Knex的安装和Schema的使用,欢迎评论区交流。

相关推荐
web守墓人1 小时前
【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库
前端·javascript·html
小苹果13571 小时前
阿里云mysql数据丢失,如何通过服务器备份在其他服务器上恢复数据,并获取mysql丢失数据,完成mysql数据恢复
服务器·mysql·阿里云
张璐月2 小时前
mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响
数据库·mysql
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
秋田君6 小时前
深入理解JavaScript设计模式之命令模式
javascript·设计模式·命令模式
风吹落叶花飘荡7 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
yanlele8 小时前
我用爬虫抓取了 25 年 6 月掘金热门面试文章
前端·javascript·面试
烛阴9 小时前
WebSocket实时通信入门到实践
前端·javascript
草巾冒小子9 小时前
vue3实战:.ts文件中的interface定义与抛出、其他文件的调用方式
前端·javascript·vue.js
DoraBigHead9 小时前
你写前端按钮,他们扛服务器压力:搞懂后端那些“黑话”!
前端·javascript·架构