Elixir-Phoenix:mix ecto.create与mix phx.server同报错但数据库参数不一致
问题说明
mix ecto.create报错中数据库名为postgres属于Ecto的正常逻辑:创建新数据库时必须先连接PostgreSQL默认内置的postgres系统库,才能执行CREATE DATABASE命令创建你配置的contact业务库,不是你的配置未生效。
排查解决步骤
- 验证TCP连接有效性
你当前能通过psql正常连接,大概率是默认走了Unix域套接字,未使用TCP协议访问数据库,执行以下命令验证TCP连接是否正常:psql -h 10.110.0.3 -U staging -d postgres
如果该命令报错,说明问题出在PostgreSQL服务端配置,和应用代码无关。 - 调整PostgreSQL的pg_hba.conf配置
在PostgreSQL服务端找到pg_hba.conf文件(通常存放在/var/lib/postgresql/<PG版本号>/main/或者/etc/postgresql/<PG版本号>/main/目录下),添加以下规则允许对应IP的用户访问所有库:
host all staging 10.110.0.3/32 scram-sha-256
如果你的PostgreSQL版本较旧使用md5密码加密,将最后一项改为md5即可。修改完成后执行systemctl reload postgresql重载配置生效。
- 检查SSL连接要求
如果PostgreSQL服务端强制要求SSL连接,需要在dev.exs的Repo配置中新增SSL相关参数:
config :contact_api, ContactApi.Repo, # 原有配置保持不变,新增以下配置项 ssl: true, # 自签名证书场景添加,生产环境请替换为正规证书校验规则 ssl_opts: [verify: :verify_none]
- 验证应用配置加载是否正常
在项目根目录执行iex -S mix进入交互终端,运行以下命令打印当前Repo的实际加载配置,确认参数是否符合预期:Application.get_env(:contact_api, ContactApi.Repo)
内容的提问来源于stack exchange,提问作者BSP
相关产品推荐
相关产品推荐

