Sql server 在Docker上使用pyodbc配置SQLAlchemy-获取接口错误

Sql server 在Docker上使用pyodbc配置SQLAlchemy-获取接口错误,sql-server,sqlalchemy,pyodbc,Sql Server,Sqlalchemy,Pyodbc,我正在将Python服务更改为使用只读连接字符串。我正在从PyMSSQL迁移到PyODBC。我已经看到,pymssql中不支持只读连接字符串,而且pymssql正在停止使用。这就是背景 此服务使用sqlalchemy连接到数据库。因此,我的第一步是更改它使用的URL,现在我有了: CONNECTION_STRING=mssql+pyodbc://user:Pass@sqlserver.com/MyDB?ApplicationIntent=ReadOnly 我使用的代码如下所示: self.en

我正在将Python服务更改为使用只读连接字符串。我正在从PyMSSQL迁移到PyODBC。我已经看到,pymssql中不支持只读连接字符串,而且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。我还确保引入了MicrosoftODBCUnix驱动程序,试图绕过这个问题,但毫无效果。下面是我的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)')
这个问题的第一个问题是,关于一些我甚至没有的配置文件,没有任何东西告诉我要创建。另外,在映像中预先配置DB连接字符串是不允许的,因为我们在构建中单独管理配置

我还发现了另一个我现在找不到的方法,即配置FreeTDS。然而,我离开了FreeTDS,因为我需要只读的意图

这里缺少什么吗?

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

self.engine = sa.create_engine(connection_string)
将sqlalchemy作为sa导入
连接_uri=sa.engine.url.url(
“mssql+pyodbc”,
username=“user”,
密码=”P@ss",
host=“sqlserver.com”,
database=“MyDB”,
质疑={
“驱动程序”:“SQL Server的ODBC驱动程序17”,
“应用程序内容”:“只读”,
},
)
打印(连接uri)
“”“控制台输出:
mssql+pyodbc://user:P%40ss@sqlserver.com/MyDB?applicationcontent=ReadOnly&driver=ODBC+driver+17+for+SQL+Server
"""
如中所述,“主机名连接”必须将ODBC驱动程序的名称作为
驱动程序=
参数包含在连接URI中。使用
sqlalchemy.engine.url.url
方法构造连接URI如下所示:

self.engine = sa.create_engine(connection_string)
将sqlalchemy作为sa导入
连接_uri=sa.engine.url.url(
“mssql+pyodbc”,
username=“user”,
密码=”P@ss",
host=“sqlserver.com”,
database=“MyDB”,
质疑={
“驱动程序”:“SQL Server的ODBC驱动程序17”,
“应用程序内容”:“只读”,
},
)
打印(连接uri)
“”“控制台输出:
mssql+pyodbc://user:P%40ss@sqlserver.com/MyDB?applicationcontent=ReadOnly&driver=ODBC+driver+17+for+SQL+Server
"""

能否按照中所述构建连接URI?还要注意,
applicationcontent=ReadOnly
只是对后端数据库的提示,表明您不打算执行任何更新;它实际上并没有阻止你的应用程序这么做。@GordThompson:这看起来很有希望!我不知道关于司机的争论。我试试那个。我只需要找到需要的名字。至于你的第二个评论。谢谢尽管如此,我还是同意,因为这样做的目的将意味着他们将被定向到一个只读副本,所以这不会是一个问题。对于
msodbcsql17
包,驱动程序名是
odbcdriver17 For SQL Server
Ha抱歉,在我阅读您的答复之前找到了它。如果其他人需要找到它,只需“cat/etc/odbcinst.ini”并从那里获取第一个类别(我认为这就是他们在.ini文件中所称的类别)。我现在正在尝试更改。是否可以按照中所述构建连接URI?还要注意,
ApplicationIntent=ReadOnly
只是对后端数据库的提示,表明您不打算执行任何更新;它实际上并没有阻止你的应用程序这么做。@GordThompson:这看起来很有希望!我不知道关于司机的争论。我试试那个。我只需要找到需要的名字。至于你的第二个评论。谢谢尽管如此,我还是同意,因为这样做的目的将意味着他们将被定向到一个只读副本,所以这不会是一个问题。对于
msodbcsql17
包,驱动程序名是
odbcdriver17 For SQL Server
Ha抱歉,在我阅读您的答复之前找到了它。如果其他人需要找到它,只需“cat/etc/odbcinst.ini”并从那里获取第一个类别(我认为这就是他们在.ini文件中所称的类别)。我现在只是在尝试改变。