无法通过Python使用高山Docker映像连接到Azure SQL

时间:2019-04-29 13:54:58

标签: python sql-server docker pyodbc alpine

我有一个基于高山的docker映像,支持Python,通过它我试图连接到Azure SQL服务。这是我的简单连接代码。在Azure中连接到SQL Server时出现错误。

conn = pyodbc.connect('DRIVER ='+ driver +'; SERVER ='+ server +'; PORT = 1433; DATABASE ='+ database +'; UID ='+ username +'; PWD ='+密码) pyodbc.Error :(“'01000',“ [01000] [unixODBC] [驱动程序管理器]无法打开lib'SQL Server的ODBC驱动程序17':找不到文件(0)(SQLDriverConnect)”)nect)“)nect)”] nect)“)< / p>

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()


Here is my 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 Server的连接,还是我需要为Alpine安装MS SQL驱动程序?有没有一个?我找不到一个。请帮忙。

2 个答案:

答案 0 :(得分:1)

要确认设置:

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严重依赖pyodbc,我一直在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)

或者,您也可以按照here所述将配置添加到/etc/odbcins.ini

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

然后

import pyodbc

pyodbc.drivers()
['FreeTDS']

答案 1 :(得分:0)

RUN wget https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.7.2.1-1_amd64.apk  && \
    wget https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_17.7.1.1-1_amd64.apk  && \
    apk add --allow-untrusted msodbcsql17_17.7.2.1-1_amd64.apk && \
    apk add --allow-untrusted mssql-tools_17.7.1.1-1_amd64.apk