Sequelize 事务包括创建对象时不起作用?

问题描述 投票:0回答:1

我正在使用 Sequelize 将对象添加到 SQL Server 数据库中。 我在一个事务中执行所有操作。当我想要检索插入的对象时,不会获取关联的模型。但如果我单独查询它们,就会找到它们。

此代码有效:

 const model = await SequelizeModel.findOne({
    where: {
      name: step.relation.model,
    },
    transaction,
  });
  const modelField = await SequelizeModelField.findOne({
    where: {
      name: step.relation.field,
    },
    transaction,
  });

  const referenceModel = await SequelizeModel.findOne({
    where: {
      name: step.relation.referenceModel,
    },
    transaction,
  });

  const referenceModelField = await SequelizeModelField.findOne({
    where: {
      name: step.relation.referenceField,
    },
    transaction,
  });

但是此代码不会返回包含:

const modelField = await SequelizeModelField.findOne({
    where: {
      name: step.relation.field,
    },
    include: [
      {
        model: SequelizeModel,
        where: {
          name: step.relation.model,
        },
      },
    ],
    transaction,
  });

  const referenceModelField = await SequelizeModelField.findOne({
    where: {
      name: step.relation.referenceField,
    },
    include: [
      {
        model: SequelizeModel,
        where: {
          name: step.relation.referenceModel,
        },
      },
    ],
    transaction,
  });

生成的两个选择的 SQL:

SELECT
    [SequelizeModelField].[id],
    [SequelizeModelField].[name],
    [SequelizeModelField].[type],
    [SequelizeModelField].[length],
    [SequelizeModelField].[searchable],
    [SequelizeModelField].[default],
    [SequelizeModelField].[nullable],
    [SequelizeModelField].[unique],
    [SequelizeModelField].[primary],
    [SequelizeModelField].[autoIncrement],
    [SequelizeModelField].[tokenField],
    [SequelizeModelField].[encryption],
    [SequelizeModelField].[modelId],
    [SequelizeModelField].[created_at],
    [SequelizeModelField].[updated_at],
    [model].[id] AS [_0],
    [model].[name] AS [_1],
    [model].[tableName] AS [_2],
    [model].[ignoreFields] AS [_3],
    [model].[auditEnabled] AS [_4],
    [model].[created_at] AS [_5],
    [model].[updated_at] AS [_6]
FROM
    [__model_fields] AS [SequelizeModelField]
    INNER JOIN [__models] AS [model] ON [SequelizeModelField].[modelId] = [model].[id]
    AND [model].[name] = N'endpoints'
WHERE
    [SequelizeModelField].[name] = N'appconfig_id'
ORDER BY
    [SequelizeModelField].[id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

和:

SELECT
    [SequelizeModelField].[id],
    [SequelizeModelField].[name],
    [SequelizeModelField].[type],
    [SequelizeModelField].[length],
    [SequelizeModelField].[searchable],
    [SequelizeModelField].[default],
    [SequelizeModelField].[nullable],
    [SequelizeModelField].[unique],
    [SequelizeModelField].[primary],
    [SequelizeModelField].[autoIncrement],
    [SequelizeModelField].[tokenField],
    [SequelizeModelField].[encryption],
    [SequelizeModelField].[modelId],
    [SequelizeModelField].[created_at],
    [SequelizeModelField].[updated_at],
    [model].[id] AS [_0],
    [model].[name] AS [_1],
    [model].[tableName] AS [_2],
    [model].[ignoreFields] AS [_3],
    [model].[auditEnabled] AS [_4],
    [model].[created_at] AS [_5],
    [model].[updated_at] AS [_6]
FROM
    [__model_fields] AS [SequelizeModelField]
    INNER JOIN [__models] AS [model] ON [SequelizeModelField].[modelId] = [model].[id]
    AND [model].[name] = N'appconfig'
WHERE
    [SequelizeModelField].[name] = N'id'
ORDER BY
    [SequelizeModelField].[id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

modelField.get({ plain: true })
的输出:

{
  id: 20,
  name: "appconfig_id",
  type: "INT",
  length: null,
  searchable: null,
  default: null,
  nullable: null,
  unique: null,
  primary: null,
  autoIncrement: null,
  tokenField: null,
  encryption: false,
  modelId: 2,
  created_at: "2024-02-17T11:14:40.807Z",
  updated_at: "2024-02-17T11:14:40.807Z",
}

关联定义如下: Sequelize模型

@HasMany(() => SequelizeModelField, {
  onDelete: "CASCADE",
})
fields: SequelizeModelField[];

和 SequelizeModelField:

@ForeignKey(() => SequelizeModel)
@Column
modelId: number;

@BelongsTo(() => SequelizeModel)
model: SequelizeModel;

初始化代码:

if (environment.databaseType == "mssql") {
      dialectOptions["options"] = {
        trustServerCertificate: environment.databaseDialectSSL,
        appName: environment.swaggerTitle ?? "No Code API",
      };
    }
    

    this.sequelize = new Sequelize({
      host: environment.databaseType == "sqlite" ? null : environment.databaseHost,
      dialect: environment.databaseType as Dialect,
      dialectOptions: dialectOptions,
      database: environment.databaseName,
      port: environment.databasePort,
      username: environment.databaseUsername,
      password: environment.databasePassword,
      storage: environment.databaseType == "sqlite" ? environment.databaseHost : null,
      minifyAliases: environment.databaseType != "sqlite" ? true : false,
      logging: console.log,
      pool: {
        max: 5,
        min: 0,
        idle: 10000,
      },
      models: [
        SequelizeMigration,
        SequelizeMigrationStep,
        SequelizeMigrationStepField,
        SequelizeMigrationStepModel,
        SequelizeMigrationStepRelation,
        SequelizeMigrationStepRoute,
        SequelizeMigrationStepRole,
        SequelizeMigrationStepRoleCheck,
        SequelizeMigrationStepRoleField,
        SequelizeModel,
        SequelizeModelField,
        SequelizeModelFieldRelation,
        SequelizeModelRoute,
        SequelizeModelRouteTrigger,
        SequelizeModelRole,
        SequelizeModelRoleCheck,
        SequelizeModelRoleField,
        SequelizeView,
        SequelizeViewRoute,
        SequelizeViewRole,
        SequelizeViewRoleCheck,
      ],
      define: {
        createdAt: "created_at",
        updatedAt: "updatedAt",
      },
    });

    await this.sequelize.authenticate();
    await this.sequelize.sync();

    return this.sequelize;

我在这里遗漏了一些东西,还是在使用带有 Sequelize 的事务时这是预期的行为?

sql-server typescript sequelize.js
1个回答
0
投票

不要使用

minifyAliases: true
!我有点困惑,没有正确阅读代码。
minifyAliases
始终是
true
,因为我们进行了
sqlite
比较。当
false
时,包含工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.