簡體   English   中英

Erlang-在OpenShift上連接到PostgreSQL

[英]Erlang - connecting to postgreSQL on OpenShift

我正在嘗試通過pgsql模塊連接到數據庫。 但我有EACCES錯誤。 命令行客戶端中的數據庫正常工作。
這是一段連接代碼(也許您可以建議我如何更好地執行此代碼):

init([]) ->
case os:getenv("OPENSHIFT_POSTGRESQL_DB_HOST") of
    false ->
        Host = "127.0.0.1";
    Host ->
        ok
end,
case os:getenv("OPENSHIFT_POSTGRESQL_DB_USERNAME") of
    false ->
        User = "chat_admin";
    User ->
        ok
end,
case os:getenv("OPENSHIFT_POSTGRESQL_DB_PASSWORD") of
    false ->
        Password = "1234";
    Password ->
        ok
end,
case os:getenv("PGDATABASE") of
    false ->
        Database = "chat_database";
    Database ->
        ok
end,
Port = 5432,
io:format("DB: ~s ~s ~s ~s ~w~n", [Host, User, Password, Database, Port]),
{ok, C} = pgsql:connect(Host, User, Password, [{database, Database}, {port, Port}]),
{ok, C}.

程序顯示以下行:

DB: 127.10.206.130 adminyp4clna TDpRnwsUeJFP chat 5432

然后它死於錯誤堆棧:

{"init terminating in do_boot",{{case_clause,{error,{{shutdown,   failed_to_start_child,chatserver_db,{{badmatch,{error,eacces}},[{pgsql_sock,command,2,[{file,"src/pgsql_sock.erl"},{line,163}]},{gen_
server,try_handle_call,4,[{file,"gen_server.erl"},{line,607}]},{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,639}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,237}]}]}}},{chats
erver_app,start,[normal,[]]}}}},[{chatserver,ensure_started,1,[{file,"chatserver.erl"},{line,14}]},{chatserver,start,0,[{file,"chatserver.erl"},{line,7}]},{init,start_it,1,[]},{init,start_em,1,[]}]}}

首先,使用case內部匹配的變量是一種難聞的氣味。 case是一個返回值的表達式,因此最好編寫類似的內容。

Database = case ... of ...

我想指出一秒鍾,您有未初始化的變量,然后看到您將它們打印出來。 只有在我看到之后,您才能在案例中匹配它們:)

其次,您的代碼中有很多重復項。 對於每個參數,您都有硬編碼的默認值,因此可以將case提取到函數中:

env_or_default(Env, Default) ->
    case os:getenv(Env) of
        false -> Default;
        Value -> Value
    end.

然后這樣稱呼它:

Database = env_or_default("PGDATABASE", "chat_database").

第三,最好使用Erlang配置文件,而不是讀取os變量。 我在SO: config files的其他答案中解釋了它們。

不幸的是,對於您關於數據庫的主要問題,我沒有答案:/我嘗試了完全相同的語法,相同的參數,並且為我返回了{ok, Pid} ,因此在數據庫中一定存在某種拼寫錯誤連接詳細信息。

如果指定不存在的用戶,則會出現另一個錯誤:

{error,{error,fatal,<<"28000">>,
          <<"role \"postgres\" does not exist">>,[]}}

錯誤eacces可能是由於以不同的UNIX用戶身份運行應用程序和psql引起的。

暫無
暫無

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

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