在 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
"""
我正在更改 Python 服务以转为使用只读连接字符串。我正在从 PyMSSQL 迁移到 PyODBC。我从
此服务使用 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
"""