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



我继承了一个项目,其中2个序列化实体存储在同一个表中。所以它们都有相同的tableNameschema

@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
}

代码实际上运行良好,但是当我为这段代码编写测试时,我使用了内存中的SQL

dbConnection = new Sequelize('sqlite::memory:', {
models,
logging: false,
});
await dbConnection.sync({ force: true, logging: true });
jest.spyOn(FooModel, 'schema').mockImplementation(() => FooModel);
jest.spyOn(BarModel, 'schema').mockImplementation(() => BarModel);

到目前为止一切正常,但是当第一个记录插入到表中时,错误弹出。

DatabaseError [SequelizeDatabaseError]: SQLITE_ERROR: no such column: fieldB

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

是否有办法告诉sequelize/mysql在创建表时有效地包括两个实体的字段

我试了很多不同的设置。

  • 我尝试将force: true更改为alter: true
  • 我试图使用define: { freezeTableNames: true }
  • 我尝试添加dialect: 'mysql'
  • 我尝试设置:paranoid: true

因为它只影响测试,而且表中实际上有很多生产数据,所以更改表名是我希望保留的最后一个选项。

<标题>

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

所以您有两个具有相同名称的表?我相信sync()方法只会创建其中一个。除非您运行您的生产迁移测试,我不认为同步将允许您有两个表具有相同的名称。

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

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

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

这一切都解决了。

相关内容

  • 没有找到相关文章

最新更新