MySQLdb._exceptions.OperationalError: (2002, "Не удается подключиться к серверу на '<servername>.database.windows.net') | Django+Azure+MySql
У меня проблемы с подключением моего приложения Django на локальной машине к базе данных MySql в Azure? Я добавил свой IP в правила и подключаюсь следующим образом:
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '<servername>.database.windows.net',
'PORT': '3306',
'NAME': '<database_name>',
'USER': '<admin>@<servername>',
'PASSWORD': '<cecret>',
'OPTIONS': {'ssl': {'pem': 'tls.pem'} }
},
Я могу подключиться с помощью AzureDataStudio, но не с такой конфигурацией в django. Я Nmaped мой хост, нашел кучу открытых портов, но 3306 и 1433 привязаны к Sql серверам.
Django's runserver показывает MySQLdb._exceptions.OperationalError: (2002, "Can't connect to server on '<servername>.database.windows.net' (115)") с такой конфигурацией, даже если у меня запущен этот сервер и база данных в нем.
Один пример php строки запроса в портале Azure имеет:
$conn = new PDO("sqlsrv:server = tcp:<server_name>.database.windows.net,1433; Database = <database_name>", "<admin>", "{your_password_here}");
Итак, я предполагаю, что должен подключиться к 1433, но из DataStudio работает только 3306. Из python manage.py runserver он показывает django.db.utils.OperationalError: (2013, "Lost connection to server at 'handshake: reading initial communication packet', system error: 104"), если я пробую порт 1433. Я на пределе своих знаний относительно этого.
Для подключения Python к Azure Database for MySQL необходимо установить коннектор MySQL на локальной машине с помощью следующей команды.
pip install mysql-connector-python
Позднее, на странице обзора сервера, запишите Имя сервера и Имя логина администратора сервера.
Добавьте пример кода в файл. В коде замените местоположения <mydemoserver>, <myadmin>, <mypassword> и <mydatabase> на значения для вашего сервера MySQL и базы данных.
Примечание: SSL включен по умолчанию на серверах Azure Database for MySQL. Вам может потребоваться загрузить SSL-сертификат DigiCertGlobalRootG2 для подключения из локальной среды. Замените значение ssl_ca в коде на путь к этому файлу на вашем компьютере.
import mysql.connector
from mysql.connector import errorcode
# Obtain connection string information from the portal
config = {
'host':'<mydemoserver>.mysql.database.azure.com',
'user':'<myadmin>@<mydemoserver>',
'password':'<mypassword>',
'database':'<mydatabase>',
'client_flags': [mysql.connector.ClientFlag.SSL],
'ssl_ca': '<path-to-SSL-cert>/DigiCertGlobalRootG2.crt.pem'
}
# Construct connection string
try:
conn = mysql.connector.connect(**config)
print("Connection established")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with the user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
else:
cursor = conn.cursor()
# Drop previous table of same name if one exists
cursor.execute("DROP TABLE IF EXISTS inventory;")
print("Finished dropping table (if existed).")
# Create table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
print("Finished creating table.")
# Insert some data into table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
print("Inserted",cursor.rowcount,"row(s) of data.")
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("orange", 154))
print("Inserted",cursor.rowcount,"row(s) of data.")
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("apple", 100))
print("Inserted",cursor.rowcount,"row(s) of data.")
# Cleanup
conn.commit()
cursor.close()
conn.close()
print("Done.")
Обратитесь к шагам, приведенным в этом официальном руководстве для развертывания того же самого.
Очевидно, я использовал строку подключения и бэкенд, который не поддерживал "базу данных MySql", которую я использовал. Я все еще смутно представляю, как это работало, но вот оно.
Я создал новую Azure Database for MySql servers и создал там новую Базу Данных. Затем использовал строки подключения, предоставленные @UtkarshPal-MT в моей оригинальной записи Django DATABASE={}. Больше ничего делать не пришлось. Он просто подключился.
Примечание: Вы в обязательном порядке должны сдать этот сертификат.
Edit1: Если вы используете это, как я.

Тогда вам нужно использовать этот внешний бэкенд mssql-django с соответствующими драйверами. Подробности об использовании этого бэкенда вы можете найти на этой странице PyPi.
