我正在使用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');
});
有什么想法吗?我没有考虑的这种方法是否存在问题?
答案 0 :(得分:0)
TLDR:我不推荐。
我自己也在想同样的事情。您可以按照建议使用Knex创建内存表:table.engine('MEMORY');
但是,它遇到与使用SQLite相同的问题,但更糟。这不像InnoDB存储在内存中而不是存储在磁盘中一样,它是一个完全不同的引擎,它甚至没有尝试表现得像InnoDB。
我尝试按照您的建议替换InnoDB表,但是没有用。当只替换几个表时,我的外键约束失败。某些表甚至无法创建,因为内存引擎不支持Blob / Text字段。可能还有更多不同之处,但我停在那里。
更新:经过一番研究,我发现最好的解决方案是将 MySQL的数据存储在tempfs挂载(RAM磁盘)上。
在我的情况下,我们使用docker,就像在MySQL容器的docker-compose中添加以下几行一样简单。
tmpfs:
- /var/lib/mysql