Python - 调试模块加载问题

问题描述 投票:0回答:1

我正在尝试部署带有 pyodbc 层的 AWS Python Lambda 函数以进行数据库访问。当我运行该函数并尝试连接到数据库时,我收到一条错误,指示“connect”属性不存在。

我正在通过 Terraform 部署我的函数。

“import pyodbc”完成正常,这告诉我 Lambda 找到了该模块。图层文件夹结构如下...

/lib
/msodbcsql18
/python
    /python/pyodbc-5-1.0.dist-info
    /python/pyodbc.cpython-38-x86_64-linux-gnu.so
    /python/pyodbc.pyi
/odbc.ini
/odbcinst.ini

这是功能代码...

import pyodbc
import os
import platform

def lambda_handler(event, context):

    context.log(f"Platform: {platform.platform()}\n")

    for item in os.listdir("/opt"):
        context.log(f"ODBC Files: {item}\n")

    conn_str = 'DRIVER={0};SERVER={1};UID={2};PWD={3};Port={4};TrustServerCertificate=yes'.format(
        "{ODBC Driver 18 for SQL Server}",
        os.environ["server_name"],
        os.environ["user_name"],
        os.environ["password"],
        os.environ["ip_port"]
    )

    try:
        context.log("[INFO] Attempting database connection\n")
        db = pyodbc.connect(conn_str)
    except Exception as e:
        context.log(f"[ERROR] Connection failed - {e}\n")
        return

我假设因为错误表明 pyodbc“connect”属性不存在,所以 ODBC 驱动程序是不相关的。换句话说,如果 pyodbc 模块未正确加载,它就无法尝试加载 ODBC 驱动程序。

lambda 平台是“Linux-5.10.209-218.812.amzn2.x86_64-x86_64-with-glibc2.2.5”。我认为这与 pyodbc 二进制文件“pyodbc.cpython-38-x86_64-linux-gnu.so”匹配,所以我相当确定不存在任何平台或体系结构兼容性问题。但是,我不知道如何确定 pyodbc 二进制文件是否实际加载,或者加载时是否出现错误。

我花了几天时间在 GitHub 和其他博客上摆弄各种 pyodbc 层,但运气不佳。

太好了,我做错了什么?我的假设此时 ODBC 驱动程序无关紧要吗?

python aws-lambda pyodbc
1个回答
0
投票

我使用这个 Dockerfile https://github.com/davidcomerford/pyodbc-mssql-lambda-layer/blob/main/Dockerfile.python.3.11.x86_64 来构建用于创建 ODBC 层的映像。

有一行编译 unixODBC 返回错误,表明无法猜测目标平台。所以我将其设置为针对 x86_64 进行编译。我发现虽然我的 Dockerfile 配置为针对 x86_64 进行编译,但它却针对 arm64 进行编译。我更改了 Dockerfile 以针对 arm64 进行编译,一切开始按预期工作。

我的整个职业生涯都是 Windows 用户,最近在 M2 上深入了解了 MAC。我怀疑 MAC 上的 Docker 不喜欢尝试编译 x86_64,即使它会运行 x86 容器。

© www.soinside.com 2019 - 2024. All rights reserved.