gpt4 book ai didi

python-3.x - 从 OpenShift 中运行的 Python 连接到 Azure SQL 数据库时,SQL_HANDLE_HENV 上的驱动程序的 SQLAllocHandle 失败 (0) (SQLDriverConnect)

转载 作者:行者123 更新时间:2023-12-03 15:56:28 25 4
gpt4 key购买 nike

仅当尝试从运行的 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 上的 Docker 中尝试了完全相同的代码 - 它始终有效!问题仅出现在我在 OpenShift 中运行的容器中!
我检查了我可以在 1433 年从 Openshift telnet 到我的 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)

在我的 flask 应用程序中(在调用“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 中工作的容器。
感谢您的观看!

最佳答案

unixODBC 正在尝试在当前用户主目录中查找 odbc.ini。它试图通过 looking up the user in /etc/passwd 来做到这一点.由于 Openshift 正在使用/etc/passwd 中不存在的项目特定 UID,因此用户查找将不起作用并且连接将失败。

要解决此问题,请将以下内容添加到 dockerfile

ADD entrypoint.sh .
RUN chmod 766 /etc/passwd
..
..
ENTRYPOINT entrypoint.sh

以及入口点脚本中的以下内容
export $(id)
echo "default:x:$uid:0:user for openshift:/tmp:/bin/bash" >> /etc/passwd
python3.7 app.py

以上将在容器启动期间将当前用户插入到/etc/passwd 中。

另一种可能更好的方法是使用 nss_wrapper:
https://cwrap.org/nss_wrapper.html

关于python-3.x - 从 OpenShift 中运行的 Python 连接到 Azure SQL 数据库时,SQL_HANDLE_HENV 上的驱动程序的 SQLAllocHandle 失败 (0) (SQLDriverConnect),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55474713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com