【发布时间】:2021-02-18 00:25:50
【问题描述】:
我继承了一个项目,其中 2 个续集实体存储在同一个表中。
所以他们都有相同的tableName和schema。
@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