反对.js |用于 Node.js 的 SQL 友好 ORM
Node.js 有很多对象关系映射器(用于关系数据库),我们可以从以下几个流行的映射器中进行选择:
- 续集
- Mongoose或棱镜
- 类型ORM
- Objection.js(在此处阅读完整文档)
为什么要考虑 Objection.js?
所以这里有几个理由考虑使用它:
- 定义模型和它们之间关系的简单方法。
- 使用 Node 的 async/await 创建查询。
- 对模型使用预先加载和事务。
- 使用行中的嵌套文档。
- 用于插入和更新对象图的强大机制。
- TypeScript 支持和 JSON 模式验证。
必须按照以下步骤安装和使用 Objection.js:
所以你安装它的方式就是安装两个依赖: knex和objection ,使用如下命令:
npm i knex -g --save
npm i objection --save
Knex 是一个强大的 SQL 查询构建器(它使用了一大堆不同的 ORM)。所以在后台,反对使用 Knex。除了构建 SQL 查询外,Knex 还用于建立数据库连接和池连接。它还用于通过迁移管理数据库模式。
您可能还需要为要使用的任何 SQL 数据库安装数据库驱动程序。一些可用的选项,只需使用以下命令安装它们:
npm i pg
npm i sqlite3
npm i mysql
npm i mariasql
创建数据库:
文件名:app.js
const { Client } = require('pg');
const { db } = require('./config');
const client = new Client();
(async () => {
await client.connect();
await client.query(`CREATE DATABASE ${db.connection.database}`);
await client.end();
})();
创建迁移:
- 迁移允许您以逐步的方式将更改应用到数据库模式。
- “向上”操作应用更改(创建表、添加/修改列等)。
- “向下”操作应用更改的反向操作(例如,如果迁移的“向上”操作创建了一个表,则等效的“向下”操作将删除该表)。
- Knex 将创建一个迁移文件夹(除非它已经存在)。
- 然后它会在迁移文件夹中为迁移创建一个文件。
knex migrate:make create_tasks_table
生成迁移将如下所示:
文件名:empty_migration.js
exports.up = function (knex, Promise) {
};
exports.down = function (knex, Promise) {
};
现在我们可以执行某些操作,例如创建表:
文件名:knex_migration.js
const tableName = 'tasks';
exports.up = knex => {
// Create the tasks table
return knex.schema.createTable(tableName, table => {
table.increments('id').primary();
table.string('name');
table.date('due_by');
table.boolean('is_done').defaultTo(false);
table.timestamps(true, true);
table.unique(['name']);
});
};
exports.down = knex => {
// Drop the tasks table
return knex.schema.dropTableIfExists(tableName);
};
现在,如果你想运行它们,那么下面的代码将执行它:
knex migrate:latest
楷模:
- 模型是数据库表的包装器。
- 它们有助于将业务逻辑封装在这些表中(关系、验证、索引、触发器)。
- Objection.js 允许您使用 ES6 类创建模型。
一个非常好的和简单的例子如下所示:
文件名:TaskModel.js
// Task Model
const { MODEL } = require('objection');
const db = require('../db');
// Pass he knex connection to Objection
Model.knex(db);
class Task extends Model {
// Tells objection what the db
// table is for the model
static get tableName() {
return 'tasks';
}
}
module.exports = Task;
项目结构将如下所示:
- 简单选择查询:
文件名:select_query.sqlSELECT * from tasks;
可以通过以下方式完成:
文件名:objection_select_query.jsconst tasks = await Task.query();
- 典型的 SELECT 查询:
文件名:standard_select_query.sqlSELECT * from tasks WHERE is_done = false ORDER BY due_by asc;
可以通过以下方式完成:
文件名:objection_standard_select_query.jsconst tasks = await Task.query() .where({is_done: false}).orderBy('due_by');
- 插入查询:
文件名:insert_query.sqlINSERT INTO tasks (name) VALUES ('Setup Code Coverage');
可以通过以下方式完成:
文件名:objection_insert_query.jsawait Task.query().insert({ name: 'Setup Code Coverage' });
- 更新查询:
文件名:update_query.sqlUPDATE tasks SET is_done = true WHERE id = 1;
可以通过以下方式完成:
文件名:objection_insert_query.jsawait Task.query().patch({ is_done: true }).where({ id: 1 });
如果我们使用 objection_standard_query.js 文件检查输出,那么输出将如下所示:
因此,异议查询非常强大且易于使用。