簡體   English   中英

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

[英]How do I use the MySQL MEMORY storage engine with Knex?

我正在使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM