Imagem de destaque do blog justcode.com.br.

Configurando o banco de dados MySQL no framework Django

Hoje veremos como realizar a configuração do banco de dados MySQL utilizando-se o driver mysqlclient no framework web Django.

📝 Código testado no Django 5.

📝 O framework Django 5 suporta 8.0.11 ou superior.

Mysqlclient

O pacote mysqlclient fornece uma interface para se conectar e interagir com um banco de dados MySQL a partir de um programa Python.

Ele é comumente usado em aplicações Python que precisam armazenar ou recuperar dados de um banco de dados MySQL.

O mysqlclient é uma implementação de Python da API MySQL desenvolvida em C, o que o torna rápido e eficiente para manipular grandes volumes de dados em um banco de dados MySQL a partir de código Python.


Dependências

Ubuntu

sudo apt install \
python3-dev \
default-libmysqlclient-dev \
build-essential

Fedora

sudo dnf install \
python3-devel \
mysql-devel

Instalação

pip install mysqlclient

Caso não tenha acesso a instalar as dependências para compilação do pacote mysqlclient é possível instalar o pacote pré compilado através do comando:

pip install --only-binary :all: mysqlclient

Conexão

A configuração da conexão é feita na variável DATABASES do arquivo settings.py:

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'dbuser',
        'PASSWORD': '123456',
        'HOST': '0.0.0.0',
        'PORT': '3306',
        'OPTIONS': {
        'init_command': 'SET sql_mode="STRICT_TRANS_TABLES"',
        'charset': 'utf8mb4',
    },
  }
}

Onde:

  • ENGINE: Driver será usado pelo Django.
  • NAME: Nome do database que será usado nessa conexão.
  • USER: Nome do usuário que irá utilizar o banco. Usuário deve ter as permissões necessária para manipular o banco.
  • PASSWORD: Senha do usuário.
  • HOST: IP ou nome do computador onde o banco de dados está sendo executado.
  • PORT: Porta que o banco de dados está utilizando. O padrão é 3306.

🚨 No código acima os valores das variáveis estão sendo passados hardcoded.

Se possível evite fazer isso, de preferência pela utilização de variáveis de ambiente ou arquivos .env.

Também é possível utilizar um arquivo com os parâmetros de conexão, para isso:

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'init_command': 'SET sql_mode="STRICT_TRANS_TABLES"',
            'read_default_file': str(BASE_DIR.joinpath('mysql.cnf')),
        },
    }
}

📝 O arquivo de configuração pode estar em outros diretórios.

No arquivo mysql.cnf:

[client]
database = database_name
user = dbuser
password = 123456
host = 0.0.0.0
port = 3306
default-character-set = utf8mb4

📝 Lembre-se de adequar conforme as suas necessidades.


Extra

Docker compose

Configuração do banco que foi utilizada nos testes com o framework web Django (docker-compose.yml):

# docker-compose.yml

# [Docker](https://docs.docker.com/):
# - `docker-compose up`.
# - `docker-compose down`.

# [podman](https://podman.io/) - [podman-compose](https://github.com/containers/podman-compose):
# - `podman-compose up`.
# - `podman-compose down.

services:
  db:
    image: mysql:8.3.0
    container_name: MySQL
    restart: on-failure
    # Não utilizar em produção.
    command: --default-authentication-plugin=mysql_native_password
    # Privileged para evitar o erro: '/var/lib/mysql/': Permission denied.
    privileged: true
    volumes:
      - ../databases/mysql:/var/lib/mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: 123456
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: database_name

📝 Arquivo docker-compose.yml testado com podman-compose.