Невозможно подключиться к Azure SQL, используя образ альпийского докера с Python - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть образ докера на основе Alpine с поддержкой Python, через который я пытаюсь подключиться к службе Azure SQL.Вот мой простой код подключения.Я получаю сообщение об ошибке при подключении к серверу SQL в Azure.

conn = pyodbc.connect ('DRIVER =' + драйвер + '; SERVER =' + сервер + '; PORT = 1433; DATABASE =' + база данных + '; UID =' + имя пользователя + '; PWD =' + пароль) pyodbc.Error: ('01000', "[01000] [unixODBC] [Driver Manager] Не удается открыть lib 'ODBC Driver 17 для SQL Server': файл не найден (0) (SQLDriverConnect)") nect) ")

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 позабочусь о соединении с SQL-сервером в Azure или мне нужно установить драйвер MS SQL для alpine? Есть ли один доступный? Я не могу его найтиПожалуйста, помогите.

1 Ответ

1 голос
/ 29 апреля 2019

Для подтверждения настройки:

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

Зачем устанавливать unixodbc и freetds?Для установки pip в Pyodbc требуются пакеты в unixodbc-dev и библиотеки gcc в build-base, так что обойти это невозможно.Драйвер freetds, как правило, имеет меньше проблем с pyodbc и сильно зависит от pymssql, который я использовал в докере вместо pyodbc.Это личное предпочтение, однако, вы можете просто включить драйвер unixodbc.Теперь, чтобы найти драйвер

import pyodbc
pyodbc.drivers()
# []

Pyodbc не может найти их, но они определенно установлены, поэтому мы можем найти их с помощью сценария оболочки:

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/odbcins.ini, как упоминалось здесь :

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

Тогда

import pyodbc

pyodbc.drivers()
['FreeTDS']
...