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

时间:2017-06-14 14:16:54

标签: sql-server azure elixir phoenix-framework

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

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

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

我的应用配置如下..

config :my_app, MyApp.Repo,
adapter: MssqlEcto,
username: "<my_username>",
password: "<my_password>",
database: "test",
hostname: "<my_server>.database.windows.net", 
pool_size: 10

我的环境如下..

  • MacOS Sierra 10.12.5
  • Elixir版本:1.4.4

mssql_ecto repo中已经存在一个问题,我已经尝试了那里的建议,但它仍然没有用。

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

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

1 个答案:

答案 0 :(得分:1)

我本周一直在处理相同的问题,连接到Azure SQL数据库,这就是我的工作。

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

  1. 在没有ODBC的情况下安装Erlang
  2. Mssqlex适配器缺少必需的配置选项
  3. #1:在没有ODBC的情况下安装Erlang

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

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

    在构建Erlang之前,请确保删除Kerl选项--without-odbc

    现在您已正确安装Erlang,odbc_not_started错误应该消失......将被数据库的连接错误替换。

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

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

    1. 加密
    2. TrustServerCertificate
    3. 连接超时
    4. 要解决此问题,我forked the mssqlex library并添加了这些选项in a branch。我不是要保持这个,所以请随意自行解决。

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

      {:mssqlex, git: "https://github.com/tvanhouten/mssqlex.git", branch: "azure-settings", override: true}
      

      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
      

      其他&#34;陷阱&#34;寻找

      Azure需要TCP连接:

      要连接到Azure SQL数据库,您需要确保hostname:选项以tcp:开头。所以,总之,它看起来像     主机名:&#34; tcp:.database.windows.net&#34;

      Mssql_ecto不支持Ecto 2.2 +:

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

      {:ecto, ">= 2.1.0 and < 2.2.0"}
      

      依赖缓存和锁定问题:

      如果根据上述内容似乎一切正常,但似乎没有按照预期更新和编译新的依赖项,请执行以下操作:

      1. 运行mix deps.clean --all
      2. 从根项目目录中删除mix.lock文件
      3. 运行mix deps.get
      4. 运行mix deps.compile
      5. 应该这样做!