Erlang:调用mnesia的副作用:多次创建_模式?

Erlang:调用mnesia的副作用:多次创建_模式?,erlang,mnesia,Erlang,Mnesia,在每次应用程序启动时调用mnesia:create_schema()是否有副作用 从我一直阅读的内容来看,每个数据库实例只能调用一次此函数。在现有数据库上多次调用它是一个大问题吗?那么,它可能会在第二次调用时引发异常。抓住它。我以前在开发中做过,它会在已经存在的表上发出警告。然而,我不会在生产中重新运行它,因为它可能有一些我不知道的副作用,即使现在没有,也不能保证它在未来的版本中不会出现 为什么要多次运行它?它没有副作用,但以后的调用将导致{error,{Node,{ready_exists,N

在每次应用程序启动时调用
mnesia:create_schema()
是否有副作用


从我一直阅读的内容来看,每个数据库实例只能调用一次此函数。在现有数据库上多次调用它是一个大问题吗?

那么,它可能会在第二次调用时引发异常。抓住它。

我以前在开发中做过,它会在已经存在的表上发出警告。然而,我不会在生产中重新运行它,因为它可能有一些我不知道的副作用,即使现在没有,也不能保证它在未来的版本中不会出现


为什么要多次运行它?

它没有副作用,但以后的调用将导致{error,{Node,{ready_exists,Node}}。你可以用像

ensure_schema() ->
  Node = node(),
  case mnesia:create_schema([Node]) of
    ok -> ok;
    {error, {Node, {already_exists, Node}}} -> ok;
    Error -> Error
  end.

您确定该异常是否存在,因为该异常未在文档中列出:。它不会引发异常。如果出现任何错误,它将返回{error,…}。我也觉得处理mnesia模式很尴尬。作为安装过程的一部分,您必须调用它一次,但是没有方便的地方这样做。@Zed:我也这么觉得。我不喜欢创建一个“只做一次”的管理路径,因此我打算在每个守护进程启动时“运行”这个函数。您如何处理postgres和initdb?在应用程序启动时调用它吗?我通常只有一个erlang安装脚本。设置数据库。这是一个部署步骤,而不是应用程序启动步骤,因此将它们分开是有意义的。。。我只能接受一个答案!