ZetCode

Knex.js 教程

最后修改于 2023 年 10 月 18 日

在本文中,我们将展示如何使用 Knex.js 在 JavaScript 中进行数据库编程。

Knex.js

Knex.js 是一个用于关系数据库的 JavaScript 查询构建器,包括 PostgreSQL、MySQL、SQLite3 和 Oracle。它可以与回调和 Promise 一起使用。它支持事务和连接池。

在本文中,我们使用 MySQL。

设置 Knex.js

首先,我们安装 Knex.js。

$ npm init -y

我们启动一个新的 Node 应用程序。

$ npm i knex mysql2

我们安装 Knex.js 和 MySQL 驱动程序。有两个可用的驱动程序:mysqlmysql2;我们选择了后者。

使用 Knex.js 获取数据库版本

在第一个示例中,我们找出 MySQL 的版本。

version.js
const options = {
    client: 'mysql2',
    connection: {
        host: '127.0.0.1',
        user: 'user12',
        password: 's$cret',
        database: 'mydb'
    }
}

const knex = require('knex')(options);

knex.raw("SELECT VERSION()").then(
    (version) => console.log((version[0][0]))
).catch((err) => { console.log( err); throw err })
    .finally(() => {
        knex.destroy();
    });

该示例返回 MySQL 的版本。

const options = {
    client: 'mysql2',
    connection: {
        host: '127.0.0.1',
        user: 'user12',
        password: 's$cret',
        database: 'mydb'
    }
}

这些是 MySQL 的连接选项。

const knex = require('knex')(options);

我们加载 Knex.js 并提供连接选项。

knex.raw("SELECT VERSION()").then(
    (version) => console.log((version[0][0]))
).catch((err) => { console.log( err); throw err })
    .finally(() => {
        knex.destroy();
    });

使用 raw 函数,我们执行 SQL 语句。如果语句运行正常,我们打印输出。否则,我们记录错误。最后,我们使用 destroy 关闭数据库连接。

$ node version.js 
TextRow { 'VERSION()': '5.7.22-0ubuntu0.16.04.1' }

Knex.js 创建表

在第二个示例中,我们创建一个新的数据库表。

create_table.js
const options = {
    client: 'mysql2',
    connection: {
        host: '127.0.0.1',
        user: 'user12',
        password: 's$cret',
        database: 'mydb'
    }
}

const knex = require('knex')(options);

knex.schema.createTable('cars', (table) => {
    table.increments('id')
    table.string('name')
    table.integer('price')
}).then(() => console.log("table created"))
    .catch((err) => { console.log(err); throw err })
    .finally(() => {
        knex.destroy();
    });

使用 Knex.js 模式 createTable 函数创建一个新表。我们定义模式以包含三列:id、name 和 price。

Knex.js 插入数据

接下来,我们将向创建的表中插入一些数据。

insert_cars.js
const options = {
    client: 'mysql2',
    connection: {
        host: '127.0.0.1',
        user: 'user12',
        password: 's$cret',
        database: 'mydb'
    }
}

const knex = require('knex')(options);

const cars = [
    { name: 'Audi', price: 52642 },
    { name: 'Mercedes', price: 57127 },
    { name: 'Skoda', price: 9000 },
    { name: 'Volvo', price: 29000 },
    { name: 'Bentley', price: 350000 },
    { name: 'Citroen', price: 21000 },
    { name: 'Hummer', price: 41400 },
    { name: 'Volkswagen', price: 21600 },
]

knex('cars').insert(cars).then(() => console.log("data inserted"))
    .catch((err) => { console.log(err); throw err })
    .finally(() => {
        knex.destroy();
    });

我们使用 knex('cars) 选择 cars 表,并使用 insert 方法插入八行数据。

Knex.js 选择所有行

在下面的示例中,我们从 cars 表中选择所有行。

select_cars.js
const options = {
    client: 'mysql2',
    connection: {
        host: '127.0.0.1',
        user: 'user12',
        password: 's$cret',
        database: 'mydb'
    }
}

const knex = require('knex')(options);

knex.from('cars').select("*")
    .then((rows) => {
        for (row of rows) {
            console.log(`${row['id']} ${row['name']} ${row['price']}`);
        }
    }).catch((err) => { console.log( err); throw err })
    .finally(() => {
        knex.destroy();
    });

我们使用 select 函数选择所有行。这次我们使用 from 函数选择了表。然后我们遍历返回的行数组并打印这三个字段。

$ node select_cars.js 
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
6 Citroen 21000
7 Hummer 41400
8 Volkswagen 21600

Knex.js 使用 WHERE 限制输出

SQL WHERE 子句用于定义要返回的行的条件。

select_where.js
const options = {
    client: 'mysql2',
    connection: "mysql://root:andrea@localhost:3306/mydb"
}

const knex = require('knex')(options);

knex.from('cars').select("name", "price").where('price', '>', '50000')
    .then((rows) => {
        for (row of rows) {
            console.log(`${row['name']} ${row['price']}`);
        }
    })
    .catch((err) => { console.log( err); throw err })
    .finally(() => {
        knex.destroy();
    });

该示例返回价格高于 50000 的汽车。

const options = {
    client: 'mysql2',
    connection: "mysql://user12:s$cret@localhost:3306/mydb"
}

这次我们提供了一个连接 URL。

knex.from('cars').select("name", "price").where('price', '>', '50000')

我们使用 select 选择了两列,并使用 where 函数添加了 WHERE 子句。

$ node select_where.js 
Audi 52642
Mercedes 57127
Bentley 350000

有三辆车的价格超过 50000。

Knex.js 排序行

我们可以使用 orderBy 函数对数据进行排序。

order_cars.js
const options = {
    client: 'mysql2',
    connection: {
        host: '127.0.0.1',
        user: 'user12',
        password: 's$cret',
        database: 'mydb'
    }
}

const knex = require('knex')(options);

knex.from('cars').select('name', 'price').orderBy('price', 'desc')
    .then((rows) => {
        for (row of rows) {
            console.log(`${row['name']} ${row['price']}`);
        }
    }).catch((err) => { console.log( err); throw err })
    .finally(() => {
        knex.destroy();
    });

该示例选择所有汽车并按价格降序排序。

$ node order_cars.js 
Bentley 350000
Mercedes 57127
Audi 52642
Hummer 41400
Volvo 29000
Volkswagen 21600
Citroen 21000
Skoda 9000

来源

Knex.js 指南

在本文中,我们使用了 Knex.js 库。我们创建了一些与 MySQL 交互的命令行程序。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。