Knex

Knex.js教程

Knex.js教程展示了如何使用Knex.jsJavaScript中对数据库进行编程。

Knex.js

Knex.js是用于关系数据库(包括PostgreSQL,MySQL,SQLite3Oracle)的JavaScript查询生成器它可以与回调和Promise一起使用它支持事务和连接池。

在本教程中,我们使用MySQL

安装Knex.js

首先,我们需要安装Knex.js

$ nodejs -v
v9.11.2

我们使用Node版本9.11.2

$ npm init

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

$ npm i knex mysql2

我们安装Knex.jsMySQL驱动程序有两个驱动程序可用: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,名称和价格。

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

三辆汽车比5万辆贵。

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

这是输出。