【发布时间】:2019-04-02 12:23:27
【问题描述】:
仅当尝试从运行的 Python 3.7 连接到我的 Azure DB 时 一个 OpenShift 容器(来自 rhel7:latest)我看到以下错误:
sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('IM004', "[IM004][unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)
我在我的 MAC、Windows 和运行 RHEL7 基本容器的 RHEL7 Virtualbox 上尝试了完全相同的代码 - 它总是有效!问题只出在我在 OpenShift 中运行的容器中! 我检查了我是否可以从 Openshift 远程登录到 1433 年的 Azure DB 服务器。
我也启用了 ODBC 日志,但没有比上述错误更多的信息。
我还应该检查什么?
这是我在 Dockerfile 中设置 MSODBC 驱动程序的方法:
RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo && \
yum remove unixODBC-utf16 unixODBC-utf16-devel && \
ACCEPT_EULA=Y yum install -y msodbcsql17 && \
yum install -y unixODBC-devel
这是引发错误的代码:
在 modules.database 内:
pyodbc_connstring_safe = 'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER='+config.settings["DB_HOST"]+\
';PORT=1433;DATABASE='+config.settings["DB_NAME"]+';UID='+config.usernames["database"]+\
';PWD={};MARS_Connection=Yes'
if config.settings["debug"]:
print("Using DB connection string: {}".format(pyodbc_connstring_safe.format("SAFE_DB_PASS")))
pyodbc_connstring = pyodbc_connstring_safe.format(config.passwords["database"])
Base = declarative_base()
quoted = urllib.parse.quote_plus(pyodbc_connstring)
def get_engine():
return create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted), echo=config.settings["debug"], pool_pre_ping=True)
在我的烧瓶应用程序中(在调用“has_table”时会引发错误):
@app.route("/baselinedb", methods=["POST"])
def create_db():
from modules.database import Base
engine = database.get_engine()
if not engine.dialect.has_table(engine, database.get_db_object_name("BaselineDefinition"), schema = 'dbo'):
Base.metadata.create_all(engine)
db.session.commit()
return "OK"
正如我在开头提到的,同一个 Dockerfile 为我提供了一个工作在 Docker 中的容器,无论是在 Mac 或 Windows 上本地还是在 RHEL7 VM 内。 感谢您的观看!
【问题讨论】:
-
您使用的是 Flask-SQLAlchemy 扩展还是 OpenShift 的 Flask-Login 扩展?本教程涵盖了两者,可能会帮助您在 OpenShift 环境中仔细检查您的配置:blog.openshift.com/…
-
感谢@MikeUbezziMSFT,我正在使用 Flask-SQLAlchemy。我去看看链接!
标签: python-3.x azure-sql-database pyodbc openshift-3 msodbcsql17