Typeorm 如何向 DB 定义存储过程、函数和触发器。如果可能的话进行迁移

jua*_*cia 5 stored-procedures typescript typeorm nestjs

我正在尝试在 Postgress 数据库中创建一个存储函数。原因是我们可能有来自该数据库的多个消费者,并且我们当前使用 typeorm 的迁移从我们的实体生成我们的表。

查看 typeorm 的文档和库的源代码,我发现某些事件和“订阅者”也有一些“监听器”的实现。

这种方法的问题在于它与技术或 ORM 本身紧密相关......

是否可以生成一个原始查询作为具有类似定义的迁移:

import { MigrationInterface, QueryRunner } from "typeorm";

export class ProcedureCreation123123123 implements MigrationInterface {
    name = 'ProcedureCreation123123123'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`
          CREATE OR REPLACE FUNCTION validate_update() RETURNS TRIGGER
          BEGIN
            ...
          END;
          CREATE TRIGGER validate_update_value
          BEFORE UPDATE
            ON table
            FOR EACH ROW
            EXECUTE PROCEDURE validate_update();
        `);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`DROP TRIGGER "validate_update_value"`);
    }

}

Run Code Online (Sandbox Code Playgroud)

我完成了 typeorm 迁移文档的生成,以了解如何生成这样的迁移,但生成它的唯一方法是在与数据库相关的实体中存在差异。

向实体添加侦听器以尝试在迁移过程中生成触发器也不起作用。这一代人表示数据库架构没有变化。

另一种选择是调用 Nestjs 服务的模块 init 来定义一个原始查询,该查询将完全执行此操作,但每次启动服务时运行这样的代码听起来是错误的,并且可能添加或不添加此功能。 。

如果有任何关于如何结合 typeorm 的迁移对我的数据库进行这样的更改的建议,那就太好了。

jua*_*cia 0

解决方案很简单:

typeorm migration:create -n NameOfMigration

生成了我正在寻找的模板...尽管我期望实体的侦听器最终会生成触发器或允许我定义此查询。我意识到我正在寻求以一种更紧密耦合的方式使用实体,而不是定义与实体的当前定义分开的迁移。

最后,在这个由 typeorm 生成的文件中,我能够定义updown根据我自己的需要来创建触发器和删除它们。