mysql - 如何将 MySQL MEMORY 存储引擎与 Knex 结合使用?

标签 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');
                });

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

最佳答案

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/

相关文章:

php - Android JSON 到 PHP 服务器

mysql - SQL批量插入CSV语法错误?

bookshelf.js - 托收交易

javascript - 你如何使用 knex.js 按顺序链接查询?

php - 从数据库获取更改/插入通知的标准方法

带有 IN 子句的 MySQL 查询会损失性能

python - 转换 mysql 中 SELECT 的返回值

javascript - 使用具有多个搜索条件的 Knex.js 和 SQL 的条件过滤器

javascript - 如何从mysql/knexjs中提取重复输入错误(1062)的键

javascript - knex.js 中的 createTable(...).createTable(...) 和 createTable(...).then(...) 有什么区别?