gpt4 book ai didi

postgresql - Erlang - 在 OpenShift 上连接到 postgreSQL

转载 作者:行者123 更新时间:2023-11-29 12:37:19 27 4
gpt4 key购买 nike

我正在尝试通过 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 配置文件,而不是读取操作系统变量。我在关于 SO 的其他回答中解释了它们:config files .

不幸的是,对于你关于数据库的主要问题,我没有答案:/我尝试了完全相同的语法,使用相同的参数,它为我返回了 {ok, Pid},所以连接详细信息中一定存在某种拼写错误。

如果我指定不存在的用户,我会收到另一个错误:

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

您的错误 eacces 可能是由于以不同的 unix 用户身份运行您的应用程序和 psql 引起的。

关于postgresql - Erlang - 在 OpenShift 上连接到 postgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com