我正在使用 Knex 和 MySQL 进行生产。我一直使用内存中的 SQLite 进行测试,但存在一些细微的不一致,因此我想改用内存中的 MySQL。谁能推荐一个好方法来做到这一点?
我目前的做法是,我的 Knex 对象是一个单例,并且在测试上下文中运行时有一个进程标志。我想我可以在我的迁移中添加这样的东西:
await knex
.schema
.createTable('organization', table => {
if (knex.processFlag === 'test')
table.engine('MEMORY');
table.increments('id').primary().unsigned();
table.string('address');
table.string('city');
table.string('state');
table.string('country');
table.string('post_code');
});
想法?我没有考虑这种方法是否存在问题?
最佳答案
TLDR:我不推荐。
我自己也有同样的想法。您可以按照建议使用 Knex 创建内存表:table.engine('MEMORY');
但是,它遇到了与使用 SQLite 相同的问题,但更糟糕。它不像 InnoDB 存储在内存中而不是磁盘中,它是一个完全不同的引擎,它甚至不尝试像 InnoDB 那样运行。
我尝试按照您的建议替换 InnoDB 表,但没有成功。当仅替换几个表时,我的外键约束失败了。有些表甚至无法创建,因为内存引擎不支持 Blob/Text 字段。可能还有更多差异,但我就到此为止了。
更新:经过一些研究,我发现最好的解决方案是让 MySQL 将其数据存储在 tempfs 挂载(RAM 磁盘)上。
就我而言,我们使用 docker,只需将以下几行添加到 MySQL 容器的 docker-compose 即可。
tmpfs:
- /var/lib/mysql
关于mysql - 如何将 MySQL MEMORY 存储引擎与 Knex 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54851895/