Sequelize:跨多个数据库的关系时“模型尚未定义”

Posted

技术标签:

【中文标题】Sequelize:跨多个数据库的关系时“模型尚未定义”【英文标题】:Sequelize: "Model has not been defined" when relationship across multiple databases 【发布时间】:2020-05-22 05:03:46 【问题描述】:

我正在尝试为每个数据库实例化一个续集。 DB1 中的某些表与 DB2 中的表有关系,并且是相反的。其中一个关系是 DB1.Utilisateur.contenuProvenance_id => DB2.Contenu.id 和 DB2.Contenu.utilisateur_id => DB1.Utilisateur.id。

这是 Utilisateur 模型:

@Table
export default class Utilisateur extends Model<Utilisateur> 

    @API() @PrimaryKey @AutoIncrement @Column( type: DataType.INTEGER )
    public id!: number;

    @Column( type: DataType.STRING, allowNull: false )
    public email!: string;

    @Column( type: DataType.STRING, allowNull: false )
    public nom!: string;

    @ForeignKey(() => Utilisateur)
    @Column( type: DataType.INTEGER, allowNull: true )
    public parrain_id?: number;

    @ForeignKey(() => Contenu)
    @Column( type: DataType.INTEGER, allowNull: true )
    public contenuProvenance_id?: number;

(是的,我正在使用 sequelize-typescript 将我的模型声明为 Typescript 类)

以下是我的 Sequelize 实例的创建方式:

let DBs = ;
for (const ZONE of zones)
    DBs[ ZONE.name ] = new Sequelize(ZONE.serveur.bdd.nom, ZONE.serveur.bdd.login, ZONE.serveur.bdd.mdp, 
        host: ZONE.serveur.bdd.hote,
        dialect: "mariadb",
        ...
        models: ZONE.modeles // Array of models
    );

问题:创建第一个实例(DB1)时,sequelize 找不到 Content 表并给我这个错误:

Error: Contenu has not been defined
    at Sequelize.model (project/node_modules/sequelize/lib/sequelize.js:443:13)
    at Sequelize.model (project/node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:29:26)
    at project/node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:51:46
    at Array.forEach (<anonymous>)
    at project/node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:49:26
    at Array.forEach (<anonymous>)
    at Sequelize.associateModels (project/node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:45:16)
    at Sequelize.addModels (project/node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:37:14)
    at new Sequelize (project/node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:19:22)

虽然数据库之间有关系,但是否可以一一创建sequelize实例?

我应该在创建所有 sequelize 实例后添加模型吗?

感谢你们的帮助

相关:

SequelizeJS: How to include association (join) across multiple databases without using raw query

【问题讨论】:

您好,我也遇到了同样的问题,您解决了吗? 嗨,因为 Sequelize 在很多方面都不能满足我的需求,所以我最终写了自己的 orm。 【参考方案1】:

Sequalize 不支持多个迁移文件夹或区分您为单个模型设置的方法。你必须非常具体。我无法判断您是否来自您提供的内容。

看看这个 SO 问题是否有帮助:Migrations in Sequelize in my own folder structure 您必须围绕默认路径配置一种方式。

这也可能提供一些见解:https://medium.com/unetiq/using-multiple-databases-with-nodejs-and-sequelize-59e0abcbbe6f

您可以在此处阅读 Sequalize 关于迁移的详细信息:https://sequelize.org/master/manual/migrations.html#the-sequelizerc-file

【讨论】:

以上是关于Sequelize:跨多个数据库的关系时“模型尚未定义”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sequelize 在一个数据库请求中将数据插入多个表?

避免 Sequelize 类的多个实例

在使用急切加载的 findOne Sequelize 方法期间,Nodejs 堆内存不足

用 graphql-sequelize 解决“IS A”关系

如何在 MySql 中使用 sequelize 运行多个原始查询?

如何使用 sequelize 和 mysql 创建一对一的关系?