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

Позднее, на странице обзора сервера, запишите Имя сервера и Имя логина администратора сервера.

enter image description here

Добавьте пример кода в файл. В коде замените местоположения <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: Если вы используете это, как я. enter image description here

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

Вернуться на верх