我正在使用 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 的事务时这是预期的行为?
不要使用
minifyAliases: true
!我有点困惑,没有正确阅读代码。 minifyAliases
始终是 true
,因为我们进行了 sqlite
比较。当false
时,包含工作正常。