在 Elixir 中处理测试和开发 Mnesia 数据库

rmo*_*njo 2 mnesia elixir

我正在学习 Elixir,需要一些帮助。我有一个使用的简单应用程序mnesia(暂时不使用Amnesia)。当我开始时,mnesia我会这样做:

:mnesia.create_schema([node()])
:mnesia.create_table(Table, [attributes: [:id, :name]])
:mnesia.start
Run Code Online (Sandbox Code Playgroud)

这将创建一个Mnesia.nonode@nohost目录。我想要的是至少有 2 个不同的数据库,一个用于测试,一个用于开发。我目前正在使用Mix.env. 我计划在我的应用程序每次停止时擦除测试数据库,并在每次启动时创建它(使用startstop方法)。

创建的数据目录mnesia采用 Erlang VM 的名称,这就是为什么我想我需要根据环境(:dev,:test:prod)命名我的 VM 。

这可能吗?这是正确的方法吗?


更新

我知道我可以选择我的 mnesia 数据库数据的存储位置(谢谢 Maryna)。但是当我指定一个“自定义”目录时,我有这种奇怪的行为:

iex(1)> :mnesia.system_info()
===> System info in version {mnesia_not_loaded,nonode@nohost,
                                {1486,66262,472243}}, debug level =  trace <===
opt_disc. Directory     <<"/my/custom/dir">> is NOT used.
use fallback at restart = false
running db nodes   = []
stopped db nodes   = [nonode@nohost] 
:no
Run Code Online (Sandbox Code Playgroud)

所以我可以看到它知道我想在哪里存储我的数据,但是它告诉我“没有使用”。我不知道为什么......然后

iex(2)> :mnesia.create_schema([node()])
{:error, {:EXIT, :function_clause}}
Run Code Online (Sandbox Code Playgroud)

创建架构失败(当我不指定“自定义”目录时工作正常)。有任何想法吗?


更新 2

必须在目录路径周围使用单引号(不知道为什么)

She*_*yar 5

mnesia为不同环境拥有单独数据库的最简单方法是Mix.env在应用程序配置中指定。你可以把这样的东西放在你的config.exs

config :mnesia, dir: 'mnesia/#{Mix.env}/#{node()}'
Run Code Online (Sandbox Code Playgroud)

但是有一些重要的事情你需要注意:

  • 使用必须使用单引号而不是双引号
  • 数据库的父目录必须存在,否则会失败。(当你没有指定自定义路径时它不会失败的原因是因为你的应用程序目录已经存在)