Pivotal/Django 用户提供的 MSSQL 数据库设置

Pivotal/Django settings for user provided MSSQL database

我在 Pivotal Cloud Foundry 上部署了一个 django 应用程序。在开发过程中,我只是坚持使用内置的 sqlite 数据库,同时将 UI 放在一起(不需要保留数据,所以 pushing/deleting 不是问题)。从那以后,我在本地服务器(Azure..但在本地)中开发了一个 SQL 服务器后端。我的组织不允许 public 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][驱动程序管理器]无法打开库 'ODBC Driver 17 for SQL Server': 找不到文件 (0 ) (SQLDriverConnect)")" 我尝试的任何驱动程序都出现错误...17,13,w/e...

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

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

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

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

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

  2. 这是您需要的 apt.yml 文件。它告诉 apt-buildpack 要安装什么,并为它们的 SQL 服务器 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 软件包而无需您手动接受他们的最终用户许可协议。

    ---
    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
    

有了这些,继续推送您的应用程序。它应该暂存并且您应该看到两个构建包 运行。 Apt buildpack 将安装 ODBC 驱动程序,Python buildpack 将设置您的应用程序。然后你的应用程序应该启动并且 运行.

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


一些最后的笔记:

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

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

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

希望对您有所帮助!

感谢 Danial post 并在 github 上分享您的代码。 由于我安装的驱动程序版本不同,因此我花了一些时间来解决连接问题。我已通过 ssh 进入应用程序以找到驱动程序文件并更新 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