将Phoenix应用程序连接到MS SQL Azure数据库

Rob*_*ion 6 sql-server elixir azure phoenix-framework

我正在尝试将凤凰应用程序连接到MS SQL.在网上浏览后,我遇到了几个名为mssql_ecto&mssqlex的适配器.

我按照自述文件中的说明将它们添加到项目中,安装了odbc并检查了数据库是否在线,但我现在收到以下错误..

[error] Mssqlex.Protocol (#PID<0.13069.0>) failed to connect: ** (Mssqlex.Error) odbc_not_started
Run Code Online (Sandbox Code Playgroud)

我的应用程序配置如下..

config :my_app, MyApp.Repo,
adapter: MssqlEcto,
username: "<my_username>",
password: "<my_password>",
database: "test",
hostname: "<my_server>.database.windows.net", 
pool_size: 10
Run Code Online (Sandbox Code Playgroud)

我的环境如下..

  • MacOS Sierra 10.12.5
  • Elixir版本:1.4.4

mssql_ecto repo中已经存在一个问题,我已经尝试了那里的建议,但它仍然无效.

如果有人设法将他们的phoenix/elixir应用程序连接到macOS上的MSSQL并且可以提供一些指令,那将非常感激(即使它以与我的方法完全不同的方式完成).

附注:在具有相同数据库的节点中尝试并且能够连接并查询数据库.

小智 2

我本周一直在解决同样的问题,连接到 Azure SQL 数据库,这就是我所做的工作。

您看到的是我遇到的两个主要问题中的第一个:

  1. 没有安装 ODBC 的 Erlang
  2. Mssqlex 适配器缺少必需的配置选项

#1:Erlang 在没有 ODBC 的情况下安装

如果您使用brew或类似的东西安装了Elixir和Erlang,那么您将获得不包含erlang-odbc的Erlang安装。为了解决这个问题,您需要从源代码安装 Erlang。

我建议您使用此处记录的方法从源代码安装 Erlang 和 Elixir: http://www.lambdacat.com/how-to-install-elixir-on-mac/

只需确保--without-odbc在构建 Erlang 之前删除 Kerl 选项即可。

现在您已经正确安装了 Erlang,odbc_not_started错误应该会消失...并被数据库的连接错误所取代。

#2:Mssqlex 适配器缺少必需的配置选项

截至目前,mssqlex适配器不支持 Azure 正在寻找的以下配置选项:

  1. 加密
  2. 信任服务器证书
  3. 连接超时

为了解决这个问题,我分叉了 mssqlex 库并将这些选项添加到分支中。我不承诺维护这个,所以请随意自己分叉它。

为了使用修改后的 mssqlex,请将 mix 依赖项替换为 github 位置和分支名称:

{:mssqlex, git: "https://github.com/tvanhouten/mssqlex.git", branch: "azure-settings", override: true}
Run Code Online (Sandbox Code Playgroud)

override: true很重要,因为 mssql_ecto 依赖于十六进制的 mssqlex 版本。

现在您可以更新您的配置:

config :my_app, MyApp.Repo,
adapter: MssqlEcto,
username: "<my_username>",
password: "<my_password>",
database: "test",
hostname: "<my_server>.database.windows.net", 
pool_size: 10,
encrypt: "yes",
trust_server_certificate: "no",
connection_timeout: "30
Run Code Online (Sandbox Code Playgroud)

其他需要注意的“陷阱”

Azure 需要 TCP 连接:

为了连接到 Azure SQL 数据库,您需要确保该hostname:选项以tcp:. 因此,总的来说,它看起来像主机名:“tcp:.database.windows.net”

Mssql_ecto 不支持 Ecto 2.2+:

如果您收到与 Ecto 或 Ecto.SubQuery 相关的错误,您可能需要确保您使用的 Ecto 版本受 mssql_ecto 支持。此时,这意味着 Ecto 2.1.x。同样,这需要对您的混合依赖项进行轻微更改:

{:ecto, ">= 2.1.0 and < 2.2.0"}
Run Code Online (Sandbox Code Playgroud)

依赖缓存和锁定问题:

如果根据上述一切似乎都按顺序进行,但新的依赖项似乎没有按预期更新和编译,请执行以下操作:

  1. 跑步mix deps.clean --all
  2. mix.lock从项目根目录中删除该文件
  3. 跑步mix deps.get
  4. 跑步mix deps.compile

应该这样做!