Sequelize.js Sequelize:同一表中的多个实体将中断测试

Sequelize.js Sequelize:同一表中的多个实体将中断测试,sequelize.js,in-memory-database,Sequelize.js,In Memory Database,我继承了一个项目,其中两个sequelize实体存储在同一个表中。 因此它们都具有相同的表名和模式 @Table({ tableName: 'thesametable', schema: 'schema', timestamps: false }) export default class FooModel extends Model<FooModel> { fieldA: string } @Table({ tableName: 'thesametable', schema:

我继承了一个项目,其中两个sequelize实体存储在同一个表中。 因此它们都具有相同的
表名
模式

@Table({ tableName: 'thesametable', schema: 'schema', timestamps: false })
export default class FooModel extends Model<FooModel> {
  fieldA: string
}

@Table({ tableName: 'thesametable', schema: 'schema', timestamps: false })
export default class BarModel extends Model<BarModel> {
  fieldB: string
}
到目前为止一切正常,但当第一条记录插入表中时,会弹出错误

DatabaseError [SequelizeDatabaseError]: SQLITE_ERROR: no such column: fieldB
检查日志文件后,我发现它只创建了一次表,当它创建表时,它只创建第一个实体的字段。因此,当为第二个实体插入数据时,字段自然会丢失

有没有办法告诉sequelize/mysql在创建表时有效地包含这两个实体的字段

我尝试了很多不同的设置

  • 我尝试将
    force:true
    更改为
    alter:true
  • 我尝试使用
    define:{freezeTableNames:true}
  • 我尝试添加
    方言:“mysql”
  • 我尝试设置:
    paranoid:true
因为它只影响测试,而且表中实际上有很多生产数据,所以更改表名是我最后一个选择

编辑:
过了一段时间,我意识到尽管这在生产中效果很好。代码作为2个微服务运行,每个微服务只使用1个实体。因此,虽然有两个实体使用同一个表,但它们并不知道彼此的存在。但是,我的测试尝试使用所有模型。

那么您有两个同名的表?我相信,
sync()
方法只会创建其中一个。除非您运行生产迁移进行测试,否则我认为sync不允许您拥有两个同名表。

虽然有多个模型引用同一个表,但我花了一些时间才意识到它们在不同的微服务中使用。因此,实际上,它们从未一起使用过。这就解释了为什么生产中没有问题

我运行的测试也只需要访问有限的一组模型。 实际上,可以明确地说明它所需要的

dbConnection = new Sequelize('sqlite::memory:', {
  models: [FooModel],
  logging: false,
});

这就解决了所有问题。

你完全正确,只允许有一张桌子。我后来发现,这两个模型从未一起使用过,即使它们是在同一个代码库中声明的。它们被用于两个密切相关的微服务中,它们独立运行,但部分共享其模型的相同代码。因此一个微服务使用
FooModel
,另一个使用
BarModel
。我必须承认,我仍然不能完全相信两个模型都存储在同一个表中这一事实。老实说,我认为开发人员并没有完全理解其后果。
dbConnection = new Sequelize('sqlite::memory:', {
  models: [FooModel],
  logging: false,
});