【问题标题】:Sequelize: multiple entities in the same table breaks testSequelize:同一张表中的多个实体中断测试
【发布时间】:2021-02-18 00:25:50
【问题描述】:

我继承了一个项目,其中 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 个实体。因此,虽然有 2 个实体使用同一张表,但他们并不知道彼此的存在。然而,我的测试尝试使用所有模型。

【问题讨论】:

    标签: sequelize.js in-memory-database


    【解决方案1】:

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

    【讨论】:

    • 你说得对,只允许一张桌子。我后来发现,即使在同一个代码库中声明了这两个模型,它们也从未一起使用过。它们用于 2 个密切相关的微服务中,这些微服务独立运行,但部分共享其模型的相同代码。所以一个微服务使用FooModel,另一个使用BarModel。我必须承认,我仍然不完全相信两个模型都存储在同一个表中的事实。老实说,我认为制作这个的开发者并没有完全理解后果。
    【解决方案2】:

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

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

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

    这一切都解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多