📜  反对.js |用于 Node.js 的 SQL 友好 ORM

📅  最后修改于: 2022-05-13 01:56:29.979000             🧑  作者: Mango

反对.js |用于 Node.js 的 SQL 友好 ORM

Node.js 有很多对象关系映射器(用于关系数据库),我们可以从以下几个流行的映射器中进行选择:

  1. 续集
  2. Mongoose或棱镜
  3. 类型ORM
  4. Objection.js(在此处阅读完整文档)

为什么要考虑 Objection.js?
所以这里有几个理由考虑使用它:

  • 定义模型和它们之间关系的简单方法。
  • 使用 Node 的 async/await 创建查询。
  • 对模型使用预先加载和事务。
  • 使用行中的嵌套文档。
  • 用于插入和更新对象图的强大机制。
  • TypeScript 支持和 JSON 模式验证。

必须按照以下步骤安装和使用 Objection.js:

所以你安装它的方式就是安装两个依赖: knexobjection ,使用如下命令:

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.sql
    SELECT * from tasks;

    可以通过以下方式完成:
    文件名:objection_select_query.js

    const tasks = await Task.query();
  • 典型的 SELECT 查询:
    文件名:standard_select_query.sql
    SELECT * from tasks WHERE is_done = false ORDER BY due_by asc;

    可以通过以下方式完成:
    文件名:objection_standard_select_query.js

    const tasks = await Task.query()
        .where({is_done: false}).orderBy('due_by');
  • 插入查询:
    文件名:insert_query.sql
    INSERT INTO tasks (name) VALUES ('Setup Code Coverage');

    可以通过以下方式完成:
    文件名:objection_insert_query.js

    await Task.query().insert({ name: 'Setup Code Coverage' });
  • 更新查询:
    文件名:update_query.sql
    UPDATE tasks SET is_done = true WHERE id = 1;

    可以通过以下方式完成:
    文件名:objection_insert_query.js

    await Task.query().patch({ is_done: true }).where({ id: 1 });

如果我们使用 objection_standard_query.js 文件检查输出,那么输出将如下所示:

因此,异议查询非常强大且易于使用。