Как получить доступ к моей базе данных SQL Azure (не в контейнере) из контейнера Docker

У меня есть SQL Server, работающий на докере. Я пытаюсь подключиться к нему из веб-приложения, написанного на python3 с помощью pymssql.

Он работает, пока я не запустил одно и то же приложение внутри контейнера докеров.

Я получаю эту ошибку:

20002, сообщение об ошибке b'DB-Lib 20002, серьезность 9:\nСбой подключения Adaptive Server (nameofmydb.database.windows.net:1433)\n'.

Код:

pymssql.connect(server='mydb.database.windows.net', port='1433', database='mydb', user='user@server', password='pwd')

Я пробовал с --net=host, но тоже не работает.

Может кто-то мне помочь, пожалуйста?

РЕДАКТИРОВАТЬ: Итак, я, наконец, преуспел примерно через 2 дня, это было из-за установки драйвера odbc в контейнере, который я делал неправильно. Также я был вынужден использовать pyodbc yes. Установите драйверы odbc + python так, как лазурь говорит вам в документах, и используйте pyodbc, а не pymssql (который работает вне докера).


person Fabieng    schedule 20.05.2019    source источник
comment
Можете ли вы попробовать выполнить ping/curling из своего контейнера, чтобы узнать, можете ли вы получить доступ к Интернету?   -  person granadaCoder    schedule 20.05.2019
comment
Работает У меня есть доступ к Интернету   -  person Fabieng    schedule 22.05.2019
comment
Интересно, порт 1433 заблокирован (?)   -  person granadaCoder    schedule 22.05.2019


Ответы (2)


Вы можете сослаться на этот блог: Ошибка подключения к адаптивному серверу (Сообщение об ошибке DB-Lib 20002, серьезность 9).

Попробуйте использовать pyodbc вместо pymssql. Я пробовал, и это работает хорошо.

import pyodbc
server = 'XXX.database.windows.net'
database = 'dbname'
username = 'username'
password = 'psd'
driver= '{ODBC Driver 17 for SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)

Документ Azure Краткое руководство: использование Python для выполнить запрос к базе данных SQL Azure также приводит пример:

import pyodbc
server = '<server>.database.windows.net'
database = '<database>'
username = '<username>'
password = '<password>'
driver= '{ODBC Driver 17 for SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
cursor.execute("SELECT TOP 20 pc.Name as CategoryName, p.name as ProductName FROM [SalesLT].[ProductCategory] pc JOIN [SalesLT].[Product] p ON pc.productcategoryid = p.productcategoryid")
row = cursor.fetchone()
while row:
    print (str(row[0]) + " " + str(row[1]))
    row = cursor.fetchone()

Надеюсь это поможет.

person Leon Yue    schedule 21.05.2019

Так что я сделал все это.

Но теперь у меня есть это:

pyodbc.OperationalError: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')

я использовал odbcinst.ini, который находится в строках подключения в лазурной панели, которые соответствуют:

[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so 
Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount=1

Я изменил драйвер и настройки, чтобы они соответствовали контейнеру докеров. Код pyodbc:

pyodbc.connect( 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:mydb.database.windows.net,1433;Database=mydb;Uid=myuser@mydb;Pwd=mypwd;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;'))

Также я повторяю это, но похоже, что все работает хорошо вне контейнера докера. я совершенно не понимаю, что происходит...

person Fabieng    schedule 21.05.2019
comment
Uid = имя пользователя, а не имя пользователя@сервер. - person Leon Yue; 22.05.2019