【问题标题】:Handling Test and Dev Mnesia databases in Elixir在 Elixir 中处理测试和开发 Mnesia 数据库
【发布时间】:2017-04-16 04:48:21
【问题描述】:

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

:mnesia.create_schema([node()])
:mnesia.create_table(Table, [attributes: [:id, :name]])
:mnesia.start

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

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

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


更新

我知道我可以选择存储我的 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

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

iex(2)> :mnesia.create_schema([node()])
{:error, {:EXIT, :function_clause}}

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


更新 2

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

【问题讨论】:

  • 你可以通过定义dir stackoverflow.com/questions/21150613/…来访问databa。 line iex(2)> :application.set_env(:mnesia, :dir, 'sample')
  • 感谢 Maryna 的意见,它有所帮助,但仍然遇到问题...
  • 我看到了更新,可能,它正在等待原子

标签: elixir mnesia


【解决方案1】:

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

config :mnesia, dir: 'mnesia/#{Mix.env}/#{node()}'

但您需要注意一些重要的事情:

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

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 2012-06-03
    • 2021-09-16
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多