【问题标题】:Pivotal/Django settings for user provided MSSQL database用户提供的 MSSQL 数据库的 Pivotal/Django 设置
【发布时间】:2019-09-24 19:30:30
【问题描述】:

我在 Pivotal Cloud Foundry 上部署了一个 django 应用程序。在开发过程中,我只是坚持使用内置的 sqlite 数据库,同时将 UI 放在一起(不需要保留数据,因此推送/删除不是问题)。我已经在本地服务器(Azure..but on prem)中开发了一个 SQL Server 后端。我的组织不允许公共 IP 服务,所以除了 Pivotal 中的 spring 应用程序之外的任何东西都是不允许的。

在我的 Windows 笔记本电脑上,与数据库 (settings.py) 对话没有问题:

'''
DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'HOST': 'xxx.database.windows.net',
        'Port': '',
        'NAME': 'Django_Admin',
        'OPTIONS':{
            'driver': 'ODBC Driver 17 for SQL Server',
            'username': 'xxx',
            'PWD': '***', 
            'Authentication': 'ActiveDirectoryPassword',
        }
    }
}
'''

但是,当我部署到 PCF 时,我收到错误“('01000',”[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server':找不到文件( 0) (SQLDriverConnect)")" 我尝试的任何驱动程序都会出现错误...17,13,w/e...

我使用我的数据库的连接字符串在 PCF 中创建了一个用户提供的服务。

如何在我的 settings.py 中调用该用户提供的服务?如果它是 PCF 提供的服务,我找到了如何调用它,但是既然它是用户提供的服务,我该如何调用它?

【问题讨论】:

    标签: python sql-server django cloud-foundry


    【解决方案1】:

    ODBC 只是一个连接数据库的标准框架。要对它进行任何操作,您需要一个 ODBC 驱动程序来与您的实际数据库通信。您正在尝试使用 ODBC,sql_server.pyodbc,但 SQL Server 的 ODBC 驱动程序未安装在运行您的应用程序的应用程序容器中。我打赌这是一个专有驱动程序,所以它不能默认安装。

    我没有专门用 Python 做这个,但我有 installed SQL Server ODBC drivers for PHP,我认为它应该是大致相同的过程(如果这不起作用,请告诉我)。

    1. 使用 Cloud Foundry 中的多构建包支持。首先使用 apt-buildpack 安装 ODBC 驱动程序。见here for using apt-buildpack。然后使用 Python buildpack 实际设置您的应用。

    2. 这是您想要的apt.yml 文件。它告诉 apt-buildpack 要安装什么,并为他们的 SQL Server ODBC 驱动程序和 mssql-tools 安装 Microsoft 软件包,可选但有助于验证您的初始设置。

      ---
      keys:
      - https://packages.microsoft.com/keys/microsoft.asc
      repos:
      - deb [arch=amd64] https://packages.microsoft.com/ubuntu/18.04/prod bionic main
      packages:
      - msodbcsql17
      - mssql-tools
      - unixodbc-dev
      
    3. 然后使用这样的 manifest.yml 文件来推送您的应用程序。这会将 apt-buildpack 设置为首先运行并安装上面的依赖项。然后它将运行 Python buildpack。它还将绑定您的 MSSQL 服务,并将环境变量 ACCEPT_EULA 设置为 Y,这是必需的,以便 apt-buildpack 可以安装 Microsoft 软件包,而无需您手动接受他们的 EULA。

      ---
      applications:
      - name: <app-name>
        buildpacks:
        - https://github.com/cloudfoundry/apt-buildpack
        - python_buildpack
        env:
          ACCEPT_EULA: Y
        services:
        - mssql-server-db
      
    4. 将包含此内容的.profile 文件添加到项目的根目录,即从您运行cf push 的位置。这会将 mssqltools 放在路径上,并告诉 unixODBC 在哪里可以找到您的 ODBC 配置。

      # the 0 indicates that apt-buildpack is the first in the list
      #  if you change the order of buildpacks you need to update this too
      export PATH=$PATH:/home/vcap/deps/0/apt/opt/mssql-tools/bin/
      
      # point to the odbcinst.ini file
      #  that file needs to have the correct path to the ODBC driver shared library
      #  it should be right, but if you change the order of the buildpacks then that
      #  would need updated too
      export ODBCSYSINI=$HOME/odbc-cfg/
      
    5. 最后,在项目的根目录中创建一个文件夹odbc-cfg(或任何您想调用的名称,它只需要匹配在步骤#4 中为ODBCSYSINI 设置的路径)。里面放了文件odbcinst.ini。里面放了这个信息。这将设置驱动程序。

      [ODBC Driver 17 for SQL Server]
      Description=Microsoft ODBC Driver 17 for SQL Server
      Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
      UsageCount=1
      

    这样,继续推送您的应用程序。它应该暂存,您应该看到两个 buildpack 都在运行。 Apt buildpack 将安装 ODBC 驱动程序,而 Python buildpack 将设置您的应用程序。然后您的应用应该会启动并运行。

    如果您有任何问题,请运行命令cf ssh &lt;app&gt; -t -c "/tmp/lifecycle/launcher /home/vcap/app bash ''"。这会将您放入容器中,并拥有所有 env 变量源,就像您的应用程序一样。然后运行sqlcmd -S &lt;db-host&gt; -U &lt;user&gt; 并验证您是否可以连接到您的数据库。


    最后的几点说明:

    • apt buildpack 需要 Internet 访问才能从 Ubuntu 和 Microsoft 存储库下载软件包。这将在分期时需要。如果您无法从暂存容器访问 Internet,则需要配置代理。

    • 您的容器需要能够连接到数据库。这意味着 IP 必须是可路由的,并且没有防火墙阻止访问。您可能还需要让您的平台操作员添加一个应用程序安全组规则,以允许对您的服务器进行出站访问。如果您无法与sqlcmd 连接,则可能是网络问题,因此请尝试基本的网络故障排除,以确保您可以连接到您的服务器。

    • Microsoft ODBC 驱动程序的版本将发生变化。当您阅读本文时,它可能会更新。当前版本反映了发布此更新时的版本。

    希望有帮助!

    【讨论】:

    • github.com/cloudfoundry/apt-buildpack 是一个实验性的构建包。如何在生产应用程序中使用它?
    • 我的意见,但尽管它是实验性的名称,但我发现它使用起来很可靠。您还可以查看提交历史并查看它正在被维护。最终使用或不使用是个人选择。另一种选择是手动将所有这些依赖项与您的应用程序捆绑在一起。这将是乏味且容易出错的,但这是一种选择。
    【解决方案2】:

    感谢 Danial 的帖子并在 github 上分享您的代码。 由于我安装的驱动程序版本不同,我花了一些时间对连接进行故障排除。我已经 ssh-ed 进入应用程序以查找驱动程序文件并更新odbcinst.ini 文件中的版本,如下所示。

    [ODBC Driver 17 for SQL Server]
    Description=Microsoft ODBC Driver 17 for SQL Server
    Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
    UsageCount=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2019-08-27
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2018-10-11
      相关资源
      最近更新 更多