【发布时间】:2016-04-11 14:50:13
【问题描述】:
我刚刚开始使用 Elixir Phoenix 新网络应用:
mix phoenix.new phoenix_sample --database mssql
它生成了带有 db 配置的 config/dev.exs 文件,我已经修改以匹配我当前的 ms sql server:
config :phoenix_sample, PhoenixSample.Repo,
adapter: Tds.Ecto,
username: "dev",
password: "dev",
database: "phoenix_sample_db",
hostname: "localhost",
pool_size: 10
我能够以 dev 用户身份登录 ssms 并连接到 phoenix_sample_db 数据库
但是当我运行时:mix ecto.create
我总是出错:
** (EXIT from #PID<0.46.0>) %Tds.Error{message: "tcp connect: nxdomain", mssql: nil}
17:44:04.805 [error] GenServer #PID<0.274.0> terminating
** (stop) %Tds.Error{message: "tcp connect: nxdomain", mssql: nil}
Last message: {:connect, [port: 1433, hostname: ".", database: "master", otp_app: :phoenix_sample, repo: PhoenixSample.Repo, adapter: Tds.Ecto, username: "dev", password: "dev", pool_size: 10]}
State: %{attn_timer: nil, env: %{trans: <<0>>}, ireq: nil, itcp: nil, opts: [port: 1433, hostname: ".", database: "master", otp_app: :phoenix_sample, repo: PhoenixSample.Repo,
adapter: Tds.Ecto, username: "dev", password: "dev", pool_size: 10], pak_data: "", pak_header: "", queue: {[{{:connect, [port: 1433, hostname: ".", database: "master", otp_app: :phoenix_sample, repo: PhoenixSample.Repo, adapter: Tds.Ecto, username: "dev", password: "dev", pool_size: 10]}, {#PID<0.46.0>, #Reference<0.0.2.504>}, #Reference<0.0.2.505>}], []}, sock: nil, state: :ready, statement: nil, tail: "", usock: nil}
为什么它不起作用以及为什么 ecto 试图连接到 master db?
如果ecto 尝试创建新数据库,那么我需要将sa 凭据传递给数据库用户配置吗?
【问题讨论】:
-
看到这个:github.com/elixir-lang/ecto/issues/932 注意说 nxdomain 意味着它无法到达主机的部分。由于您指向本地主机,因此可能是防火墙问题。
-
@OnorioCatenacci 我已经关闭了防火墙,但仍然是同样的错误
-
@Grievoushead 我没有将 MSSQL 与 Phoenix 和 Elixir 一起使用,但像 Onorio 所说的 nxdomain 意味着无法访问主机。但是,我想指出您的逻辑中的一个缺陷。当您已经创建了 phoenix_sample_db 时,您似乎想运行 ecto.create 。我还查看了 TDS GitHub 并提到了这一点:Tds Supports sql instances by passing instance: "instancename" to the connection options。也许您需要在配置中传递实例名称?
-
你是否在 MSSQL 中启用了 TCP 连接? Tds 正在尝试连接到端口 1433,这是 MSSQL 中的默认端口,但默认情况下未启用 TCP 连接。
-
@hectorsq 谢谢,它解决了,不知何故,我虽然默认使用共享内存协议。