2009-12-03 36 views
1

在每個應用程序啓動時調用mnesia:create_schema()是否有副作用?Erlang:副作用多次調用mnesia:create_schema?

從我一直在閱讀的內容來看,這個函數只能在每個數據庫實例中調用一次。在現有數據庫上多次調用它是一個大問題?

+0

抱歉,傢伙......我只能接受一個答案! – jldupont 2009-12-04 11:17:49

回答

1

我在開發之前就已經完成了它,它在已經存在的表上吐出警告。然而,我不會在生產環境中重新運行它,因爲它可能會有一些我不知道的副作用,即使它現在不能保證它不會在將來的版本中發佈。

爲什麼要多次運行它?

+1

我也覺得mnesia架構的處理很尷尬。作爲安裝過程的一部分,您必須調用它一次,但沒有方便的地方這樣做。 – Zed 2009-12-04 07:56:48

+0

@Zed:這也是我的感受。我不喜歡創建一個「這樣做一次」的管理路徑,因此我打算在每個守護進程啓動時「運行」這個功能。 – jldupont 2009-12-04 11:17:06

+0

你如何處理postgres和initdb?你是否在你的應用程序啓動時調用它? – Christian 2009-12-04 11:33:29

0

那麼它可以拋出第二個電話的異常。趕上它。

+0

是否確定'exception',因爲它沒有列在doc中:http://www.erlang.org/doc/man/mnesia.html#create_schema-1。 – jldupont 2009-12-03 20:40:26

+2

它不會拋出異常。如果出現任何錯誤,它將返回{error,...}。 – Zed 2009-12-04 07:27:02

1

它沒有副作用,但稍後調用將導致{error,{Node,{already_exists,Node}}}。您可以使用類似

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