[英]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.