2015-01-24 3 views
1

Я пытаюсь подключиться к базе данных по модулю pgsql. Но у меня есть eacces ошибка. База данных в клиенте командной строки работает нормально.
Это часть соединительного кода (может быть, вы можете мне посоветовать, как сделать этот код лучше):Erlang - подключение к postgreSQL на OpenShift

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,[]}]}} 

ответ

4

Во-первых, это плохой запах использовать переменные совпавшие внутри 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 config, вместо чтения переменных os. Я объяснил их в своем другом ответе на SO: config files.

К сожалению, у меня нет ответа на ваш основной вопрос о базе данных:/Я пробовал точно такой же синтаксис с теми же параметрами, и он возвращает {ok, Pid} для меня, поэтому должна быть какая-то орфографическая ошибка в подробности о соединении.

Если я указать несуществующий пользователь, я получаю другую ошибку:

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

Вашей ошибку eacces может быть вызвана запуском приложения и psql в различных пользователей UNIX.

Смежные вопросы