我正在try 读取Python 3.11应用程序中的本地. accdb文件,但失败了,该应用程序运行在python:3.11-alpine容器中.

我的Dockerfile执行时没有错误:

FROM python:3.11-alpine

EXPOSE 5001
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
RUN apk update && apk add --no-cache gcc g++ musl-dev unixodbc-dev flex bison gawk
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
RUN apk add --no-cache git autoconf automake libtool gettext-dev make
RUN git clone https://github.com/mdbtools/mdbtools.git
WORKDIR /mdbtools
RUN autoreconf -i -f
RUN ./configure --with-unixodbc=/usr --disable-dependency-tracking
RUN make
RUN make install
RUN echo -e "\n[MDBTools]\nDescription=MDBTools Driver\nDriver=/usr/local/lib/odbc/libmdbodbc.so" >> /etc/odbcinst.ini
RUN apk add --no-cache nano

WORKDIR /app
COPY . /app
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

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

我的Python脚本(accdb_test.py):

import pyodbc
import argparse

parser = argparse.ArgumentParser(description='Connect to an Access database.')
parser.add_argument('db_path', type=str, help='The path to the Access database')

args = parser.parse_args()

conn_str = (
    r'DRIVER={MDBTools};'
    r'DBQ=' + args.db_path + ';'
)
try:
    conn = pyodbc.connect(conn_str)
    print("Connection successful!")
except pyodbc.Error as e:
    print("Failed to connect to the database:", e)

我构建了一个连接到它的终端的容器,然后运行脚本,结果如下:

/app $ python accdb_test.py /app/input_examples/caesar/MODEL_13-16_R01.ACCDB
['MDBTools']
File not found
File not found
Unable to locate database
Failed to connect to the database: ('HY000', 'The driver did not supply an error!')

.accdb文件的路径正确,我判断了:

/app $ ls -l /app/input_examples/caesar/MODEL_13-16_R01.ACCDB
-rwxrwxrwx    1 appuser  root      47116288 Mar 18 09:29 /app/input_examples/caesar/MODEL_13-16_R01.ACCDB

推荐答案

据我所知,mdbtools期望一个2个组件的连接字符串,只有一个分号.

由于您的连接字符串以分号结尾,它正在寻找一个名为/app/input_examples/caesar/MODEL_13-16_R01.ACCDB;的文件,但找不到该文件.

这可以在源代码中看到here,它将连接字符串拆分为最多2个组件,其中任何进一步的分隔符和组件被添加到文件名中.

修复方法很简单:删除按钮:

conn_str = (
    r'DRIVER={MDBTools};'
    r'DBQ=' + args.db_path
)

Python相关问答推荐

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

如何将ctyles.POINTER(ctyles.c_float)转换为int?

时间序列分解

为什么这个带有List输入的简单numba函数这么慢

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

如何使用pytest来查看Python中是否存在class attribution属性?

导入...从...混乱

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

无法连接到Keycloat服务器

dask无groupby(ddf. agg([min,max])?''''

OpenGL仅渲染第二个三角形,第一个三角形不可见

为什么我的sundaram筛这么低效

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

如何用FFT确定频变幅值

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

Python:从目录内的文件导入目录

操作布尔值的Series时出现索引问题

如何获取给定列中包含特定值的行号?

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?