You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

amd64架构下arrow_odbc与MySQL ODBC驱动libmyodbc9兼容问题求助

amd64架构下Polars依赖arrow_odbc连接ODBC数据库失败问题

在amd64架构环境中,使用Polars通过ODBC驱动连接SQL Server和MySQL数据库时出现异常,Polars依赖的arrow_odbc组件会触发驱动文件找不到的错误。相同配置在arm64架构下可正常运行。

Dockerfile配置

FROM --platform=linux/amd64 python:3.12-slim AS build
# FROM --platform=linux/arm64 python:3.12-slim AS build

# install common dependencies
RUN apt update -y && apt install -y curl gnupg unixodbc unixodbc-dev wget

# install sqlserver odbc driver
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg && \
    curl https://packages.microsoft.com/config/debian/12/prod.list | tee /etc/apt/sources.list.d/mssql-release.list && \
    apt update -y && ACCEPT_EULA=Y apt install -y msodbcsql18

# install mysql odbc driver
ARG MYSQL_CONNECTOR_ODBC=mysql-connector-odbc-9.0.0-linux-glibc2.28-x86-64bit
# ARG MYSQL_CONNECTOR_ODBC=mysql-connector-odbc-9.0.0-linux-glibc2.28-aarch64

RUN wget -q https://dev.mysql.com/get/Downloads/Connector-ODBC/9.0/${MYSQL_CONNECTOR_ODBC}.tar.gz && \
    gunzip ${MYSQL_CONNECTOR_ODBC}.tar.gz && \
    tar xvf ${MYSQL_CONNECTOR_ODBC}.tar && \
    cp -r ${MYSQL_CONNECTOR_ODBC}/bin/* /usr/local/bin && \
    cp -r ${MYSQL_CONNECTOR_ODBC}/lib/* /usr/local/lib && \
    myodbc-installer -a -d -n "MySQL ODBC 9.0 Unicode Driver" -t "Driver=/usr/local/lib/libmyodbc9w.so"

# install python dependencies
RUN pip install -U pip pdm
ENV PYTHONPATH="${PYTHONPATH}:/app"

WORKDIR /app
COPY tasks/ingestion/[^task|Dockerfile]* ./
RUN pdm install --global --project .

COPY libraries/python/aws/ ./
COPY libraries/python/ingestion/ ./
COPY tasks/ingestion/task/ ./

CMD [ "python", "main.py" ]

测试情况

  • 仅使用pyodbc连接MySQL可正常运行
import pyodbc

conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=<db>;UID=<id>;PWD=<pwd>;ENCRYPT=yes;TrustServerCertificate=yes;"
stmt = "select * from <table> limit 500"

conn = pyodbc.connect(conn_str)
cursor = conn.execute(stmt)
  • 先导入arrow_odbc再用pyodbc连接,或直接用arrow_odbc读取数据均失败
    失败脚本1:

    import pyodbc
    from arrow_odbc import read_arrow_batches_from_odbc
    
    conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=<db>;UID=<id>;PWD=<pwd>;ENCRYPT=yes;TrustServerCertificate=yes;"
    stmt = "select * from <table> limit 500"
    
    conn = pyodbc.connect(conn_str)
    cursor = conn.execute(stmt)
    
    reader = read_arrow_batches_from_odbc(query=stmt, connection_string=conn_str)
    

    报错信息:

    Traceback (most recent call last):
      File "/app/test_odbc_ko.py", line 7, in <module>
        conn = pyodbc.connect(conn_str)
               ^^^^^^^^^^^^^^^^^^^^^^^^
    pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmyodbc9w.so' : file not found (0) (SQLDriverConnect)")
    

    失败脚本2:

    from arrow_odbc import read_arrow_batches_from_odbc
    
    conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=<db>;UID=<id>;PWD=<pwd>;ENCRYPT=yes;TrustServerCertificate=yes;"
    stmt = "select * from <table> limit 500"
    
    reader = read_arrow_batches_from_odbc(query=stmt, connection_string=conn_str)
    

    报错信息:

    Traceback (most recent call last):
      File "/app/test_odbc_ko.py", line 1, in <module>
      File "/usr/local/lib/python3.12/site-packages/arrow_odbc/reader.py", line 495, in read_arrow_batches_from_odbc
        reader.query(
      File "/usr/local/lib/python3.12/site-packages/arrow_odbc/reader.py", line 102, in query
        connection = connect_to_database(
                     ^^^^^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.12/site-packages/arrow_odbc/connect.py", line 59, in connect_to_database
        raise_on_error(error)
      File "/usr/local/lib/python3.12/site-packages/arrow_odbc/error.py", line 30, in raise_on_error
        raise Error(error_out)
    arrow_odbc.error.Error: ODBC emitted an error calling 'SQLDriverConnect':
    State: 01000, Native error: 0, Message: [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmyodbc9w.so' : file not found
    
  • 先通过pyodbc建立连接再导入arrow_odbc可正常运行

import pyodbc

conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=<db>;UID=<id>;PWD=<pwd>;ENCRYPT=yes;TrustServerCertificate=yes;"
stmt = "select * from <table> limit 500"

conn = pyodbc.connect(conn_str)
cursor = conn.execute(stmt)

from arrow_odbc import read_arrow_batches_from_odbc

reader = read_arrow_batches_from_odbc(query=stmt, connection_string=conn_str)

已尝试的解决方法

  • 更换Alpine、Ubuntu作为基础镜像
  • 改用deb包安装MySQL连接器

以上操作均未解决问题,现寻求amd64架构下的兼容解决方案。


内容的提问来源于stack exchange,提问作者Lorenzo Sciarra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:13:20