python - 无法使用带有 Python 的 alpine docker 图像连接到 Azure SQL

标签 python sql-server docker pyodbc alpine-linux

我有一个基于 alpine 的 docker 镜像,支持 Python,我正尝试通过它连接到 Azure SQL 服务。这是我的简单连接代码。

import pyodbc
server = 'blah1.database.windows.net'
database = 'mydb1'
username = 'myadmin'
password = 'XXXXXX'
driver= 'ODBC Driver 17 for SQL Server'
conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
c = conn.cursor()
c.execute("SELECT * FROM dbo.customers")

print(c.fetchall())
print(type(c.fetchall()))

conn.commit()
conn.close()

连接到 Azure 中的 SQL 服务器时,代码生成以下错误:

pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")nect)")

这是我的 Dockerfile:

FROM tiangolo/uwsgi-nginx:python3.7-alpine3.8

RUN apk update
RUN apk add gcc libc-dev g++ libffi-dev libxml2 unixodbc-dev

LABEL Name=code9 Version=0.0.1
EXPOSE 8000
ENV LISTEN_PORT=8000

ENV UWSGI_INI uwsgi.ini

WORKDIR /app
ADD . /app

RUN chmod g+w /app
RUN chmod g+w /app/db.sqlite3


RUN python3 -m pip install -r requirements.txt

我假设我是 unixODBC 将负责与 Azure 中 SQL 服务器的连接,或者我是否需要为 alpine 安装 MS SQL 驱动程序?有没有可用的?我找不到一个。请帮忙。

最佳答案

确认设置:

apk update && apk add build-base unixodbc-dev freetds-dev
pip install pyodbc

为什么要同时安装 unixodbc 和 freetds? Pyodbc 的 pip 安装需要 unixodbc-dev 中的包和 build-base 中的 gcc 库,因此无法解决。 freetds 驱动程序与 pyodbc 的问题往往较少,并且被 pymssql 严重依赖,我一直在 docker 中使用它来代替 pyodbc。不过,这是个人喜好,您可以只包含 unixodbc 驱动程序。 现在,找到驱动程序

import pyodbc
pyodbc.drivers()
# []

Pyodbc 无法找到它们,但它们肯定已安装,因此我们可以使用 shell 脚本找到它们:

find / -name *odbc.so
/usr/lib/libtdsodbc.so
/usr/lib/libodbc.so

现在,我们可以使用 subprocess 库自动设置驱动程序位置:

import subprocess

s = subprocess.Popen('find / -name *odbc.so -type f', stdout=subprocess.PIPE, shell=True).communicate()

f, _ = s

# You can change this particular loop to select whatever driver you prefer
driver = [driver for driver in f.decode().split() if 'tds' in driver][0]

driver
# '/usr/lib/libtdsodbc.so'

username = 'someuser'
server = 'someserver'
database = 'somedatabase'

conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)

或者,您可以将配置添加到/etc/odbcinst.ini,如前所述here :

[FreeTDS]
Description=FreeTDS Driver 
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

然后

import pyodbc

pyodbc.drivers()
['FreeTDS']

关于python - 无法使用带有 Python 的 alpine docker 图像连接到 Azure SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55904873/

相关文章:

sql-server - 如何在 Visual Studio 数据库项目中处理用户和登录?

sql-server - 在 SQL Server 2012 中使用 Node.js 进行身份验证

sql - 连接两个具有不同数据的相同表结构

django - 工作服 : Error- No source for in my application using Docker container

python - 加权铰链损失函数

python - matplotlib show() 不能工作两次

python - 如何知道变量是元组、字符串还是整数?

python - Pandas 根据列的值有效地分块读取大型面板 CSV

docker - 创建后如何查看docker文件?

docker - Windows docker-compose args无法正常工作