在 Docker 上使用 pyodbc 配置 SQLAlchemy - 出现接口错误

Configuring SQLAlchemy with pyodbc on Docker - getting interface error

我正在更改 Python 服务以转为使用只读连接字符串。我正在从 PyMSSQL 迁移到 PyODBC。我从 that readonly connection strings aren't supported in pymssql, and furthermore from this GH issue 看到 pymssql 无论如何都被停用了。这就是背景。

此服务使用 sqlalchemy 连接到数据库。所以我的第一步是更改它使用的 URL,现在我有了这个:

CONNECTION_STRING=mssql+pyodbc://user:Pass@sqlserver.com/MyDB?ApplicationIntent=ReadOnly

我使用它的代码如下所示:

self.engine = sa.create_engine(connection_string)

然后我更改了我的需求文件以包含 PyODBC 而不是 pymssql,然后更改了 dockerfile 以引入 ODBC 而不是 freetds。我还确保也引入了 Microsoft ODBC unix 驱动程序,以尝试解决此问题中的问题,但无济于事。这是我的 Dockerfile

中的样子
# install the Microsoft ODBC driver for SQL Server
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
  #Ubuntu 16.04 package source
  curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
  apt-get update && \
  ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev && \
  echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile && \
  echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc

然而,当我尝试使用这个引擎时,我遇到了这个错误:

InterfaceError: (pyodbc.InterfaceError) ('IM002', u'[IM002] [unixODBC][Driver Manager]Data source name not found and no default driver specified (0) (SQLDriverConnect)')

针对此问题提出的第一个问题是 this one,这是关于一些我什至没有的配置文件,没有任何东西告诉我要创建。此外,在我们的图像中预先配置数据库连接字符串是一个禁忌,因为我们将我们的配置与我们的构建分开管理。

我还找到了另外一个,现在找不到了,说的方法是配置FreeTDS。但是,我离开了 FreeTDS,因为我需要只读意图。

我是不是漏掉了什么?

mssql+pyodbc dialect documentation 中所述,“主机名连接”必须包含 ODBC 驱动程序的名称作为连接 URI 中的 driver= 参数。使用 sqlalchemy.engine.url.URL 方法构造连接 URI 如下所示:

import sqlalchemy as sa

connection_uri = sa.engine.url.URL(
    "mssql+pyodbc",
    username="user",
    password="P@ss",
    host="sqlserver.com",
    database="MyDB",
    query={
        "driver": "ODBC Driver 17 for SQL Server",
        "ApplicationIntent": "ReadOnly",
    },
)
print(connection_uri)
"""console output:
mssql+pyodbc://user:P%40ss@sqlserver.com/MyDB?ApplicationIntent=ReadOnly&driver=ODBC+Driver+17+for+SQL+Server
"""