【教程】从零开始学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的使用,欢迎评论区交流。

相关推荐
神之王楠7 分钟前
如何通过js加载css和html
javascript·css·html
余生H12 分钟前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
流烟默31 分钟前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
茶卡盐佑星_1 小时前
meta标签作用/SEO优化
前端·javascript·html
与衫1 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
Ink1 小时前
从底层看 path.resolve 实现
前端·node.js
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
Promise5201 小时前
总结汇总小工具
前端·javascript
看山还是山,看水还是。1 小时前
MySQL 管理
数据库·笔记·mysql·adb
momo小菜pa2 小时前
【MySQL 09】表的内外连接
数据库·mysql