Node.js Sequelize-尝试使模型动态化
我一直在尝试自动创建sequelize模型,方法是使用我可以将定义传递到的通用模型来创建它们,而不是专门为每个模型创建一个模型文件 我有一组模型定义,如下所示:Node.js Sequelize-尝试使模型动态化,node.js,sequelize.js,Node.js,Sequelize.js,我一直在尝试自动创建sequelize模型,方法是使用我可以将定义传递到的通用模型来创建它们,而不是专门为每个模型创建一个模型文件 我有一组模型定义,如下所示: const modelDefinitions = [ { name: "User", fieldDefinitions: [ { name: "first_name",
const modelDefinitions = [
{
name: "User",
fieldDefinitions: [
{
name: "first_name",
label: "First Name",
column_type: Sequelize.DataTypes.STRING,
},
{
name: "last_name",
label: "Last Name",
column_type: Sequelize.DataTypes.STRING,
},
{
name: "email",
label: "Email",
column_type: Sequelize.DataTypes.STRING,
},
{
name: "password",
label: "Password",
restricted: true,
column_type: Sequelize.DataTypes.STRING,
},
],
},
{
name: "Audit",
fieldDefinitions: [
{
name: "ref",
column_type: Sequelize.DataTypes.STRING,
label: "Audit Ref",
},
{
name: "result",
column_type: Sequelize.DataTypes.STRING,
label: "Result",
},
{
name: "auditor_id",
column_type: Sequelize.DataTypes.INTEGER,
label: "Auditor",
},
],
},
];
当我的模型数组只包含一个模型时,它工作得非常好,但当我有多个模型时,先前定义的模型的GenericModel就会“更改”为列表中初始化的最后一个模型
我对node是新手,所以我认为我要么缺少了一些东西,要么出现了某种模型缓存,这意味着GenericModel的所有实例都变成了它初始化为最后一个的对象
请参阅下面的示例(注释掉的代码是我用来定义模型的代码,reduce是我定义这些模型的新方法)
Myconsole.log()
返回以下内容-请注意,两者都是组
:
{
models: {
User: Group,
Group: Group
}
}
如您所见,最后一个模型的定义是什么,前面的模型继承了它,而不是保留我最初定义的模型
但我真正想要的是:
{
models: {
User: User,
Group: Group
}
}
如果我的列表中只有用户,那么它就可以正常工作。我最终成功地实现了这一点 我认为我的问题是,我的GenericModel被视为一个单例,因此为了避免这个问题,我将GenericModel从扩展Sequelize.Model改为使用构造函数创建一个新类来使用我的参数,然后在新类上创建一个方法来返回Sequelize模型 主要的变化不是用
GenericModel.init()
定义模型,而是调用sequelize.define(modelName,attributes,options)
所以我的地图现在看起来像这样:
const models = modelDefinitions.reduce((acc, modelDef) => {
return { ...acc, [modelDef.name]: new GenericModel(sequelize, modelDef).getDBModel() };
}, {});
我的班级:
class TestModel {
constructor(sequelize, modelDef) {
this.sequelize = sequelize;
this.modelDef = modelDef;
this.modelName = modelDef?.name;
this.definitions = modelDef?.fieldDefinitions;
this.restrictedFieldList = this.definitions.filter((field) => field?.restricted).map((definition) => definition.name);
}
getDBModel() {
const model = this.sequelize.define(
this.modelName,
this.definitions.reduce((acc, definition) => {
return { ...acc, [definition.name]: definition.column_type };
}, {}),
{
defaultScope: {
attributes: {
exclude: this.restrictedFieldList,
},
},
sequelize: this.sequelize,
modelName: this.modelName,
}
);
return model;
}
}```
class TestModel {
constructor(sequelize, modelDef) {
this.sequelize = sequelize;
this.modelDef = modelDef;
this.modelName = modelDef?.name;
this.definitions = modelDef?.fieldDefinitions;
this.restrictedFieldList = this.definitions.filter((field) => field?.restricted).map((definition) => definition.name);
}
getDBModel() {
const model = this.sequelize.define(
this.modelName,
this.definitions.reduce((acc, definition) => {
return { ...acc, [definition.name]: definition.column_type };
}, {}),
{
defaultScope: {
attributes: {
exclude: this.restrictedFieldList,
},
},
sequelize: this.sequelize,
modelName: this.modelName,
}
);
return model;
}
}```