如何在Knex中使用MySQL MEMORY存储引擎?

时间:2019-02-24 12:31:31

标签: mysql knex.js

我正在使用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');
                });

有什么想法吗?我没有考虑的这种方法是否存在问题?

1 个答案:

答案 0 :(得分:0)

TLDR:我不推荐。

我自己也在想同样的事情。您可以按照建议使用Knex创建内存表:table.engine('MEMORY');

但是,它遇到与使用SQLite相同的问题,但更糟。这不像InnoDB存储在内存中而不是存储在磁盘中一样,它是一个完全不同的引擎,它甚至没有尝试表现得像InnoDB。

我尝试按照您的建议替换InnoDB表,但是没有用。当只替换几个表时,我的外键约束失败。某些表甚至无法创建,因为内存引擎不支持Blob / Text字段。可能还有更多不同之处,但我停在那里。

更新:经过一番研究,我发现最好的解决方案是将 MySQL的数据存储在tempfs挂载(RAM磁盘)上。

在我的情况下,我们使用docker,就像在MySQL容器的docker-compose中添加以下几行一样简单。

tmpfs:
  - /var/lib/mysql