O MySQL é um dos bancos de dados relacionais mais populares do mundo, e quando combinado com Python, forma uma dupla imbatível para aplicações web, análise de dados e sistemas empresariais. Se você está construindo uma API REST, um sistema de gestão ou qualquer aplicação que precise armazenar dados de forma confiável, dominar a integração entre Python e MySQL é uma habilidade essencial.

Neste guia completo, você aprenderá desde a instalação dos conectores até técnicas avançadas como connection pooling, uso de ORMs e boas práticas de segurança. Todos os exemplos são funcionais e testados com Python 3.12+ e MySQL 8.0+.

Por que usar MySQL com Python?

O ecossistema Python oferece múltiplas formas de se conectar ao MySQL, cada uma com vantagens específicas. O mysql-connector-python é o driver oficial mantido pela Oracle, enquanto o PyMySQL é uma alternativa puramente Python que não depende de bibliotecas C externas. Ambos seguem a especificação PEP 249 — Python Database API Specification, que padroniza a interface de bancos de dados em Python.

Antes de começarmos, se você ainda não tem um ambiente Python configurado, recomendo nosso guia sobre instalação e configuração do ambiente Python para preparar tudo corretamente.

Instalação dos Conectores

mysql-connector-python (Oficial Oracle)

pip install mysql-connector-python

O driver oficial da Oracle é a escolha mais segura para ambientes corporativos, com suporte completo a todos os recursos do MySQL 8.0+, incluindo autenticação caching_sha2_password, conexões SSL/TLS e protocolo X DevAPI.

PyMySQL (Alternativa Pura Python)

pip install pymysql

O PyMySQL é uma excelente opção quando você precisa de uma instalação leve e portável, sem dependências de bibliotecas C. Ele é particularmente útil em ambientes de desenvolvimento ou em containers Docker onde o tamanho da imagem é uma preocupação.

SQLAlchemy (ORM + Core)

pip install sqlalchemy pymysql

O SQLAlchemy é o ORM (Object-Relational Mapper) mais maduro do ecossistema Python. Ele abstrai as diferenças entre bancos de dados e oferece uma camada de alto nível para trabalhar com MySQL, PostgreSQL, SQLite e outros. Se você prefere uma abordagem mais produtiva, o SQLAlchemy é o caminho.

Conexão Básica com MySQL

Com mysql-connector-python

import mysql.connector

config = { "host": "localhost", "user": "root", "password": "sua_senha", "database": "meu_banco" }

conexao = mysql.connector.connect(**config) print(f"Conectado ao MySQL versão {conexao.get_server_info()}") conexao.close()

Com PyMySQL

import pymysql

conexao = pymysql.connect( host="localhost", user="root", password="sua_senha", database="meu_banco", charset="utf8mb4", cursorclass=pymysql.cursors.DictCursor )

with conexao.cursor() as cursor: cursor.execute("SELECT VERSION()") resultado = cursor.fetchone() print(f"Versão: {resultado}")

conexao.close()

Note o uso de DictCursor no PyMySQL. Esse cursor retorna resultados como dicionários, onde as colunas são as chaves — muito mais legível que tuplas numéricas.

Operações CRUD com Python e MySQL

Vamos criar uma tabela de exemplo e executar as quatro operações fundamentais: Create (inserir), Read (ler), Update (atualizar) e Delete (remover).

1. CREATE — Inserindo Dados

import mysql.connector

conexao = mysql.connector.connect( host="localhost", user="root", password="sua_senha", database="meu_banco" ) cursor = conexao.cursor()

sql = "INSERT INTO usuarios (nome, email, idade) VALUES (%s, %s, %s)" valores = ("Maria Silva", "[email protected]", 28)

cursor.execute(sql, valores) conexao.commit()

print(f"Usuário inserido com ID: {cursor.lastrowid}") cursor.close() conexao.close()

Importante: Nunca use f-strings ou concatenação para montar SQL. O uso de %s como placeholder protege contra injeção SQL, um dos ataques mais comuns em aplicações web. A Real Python possui um guia aprofundado sobre segurança em MySQL com Python que vale a pena consultar.

2. READ — Consultando Dados

cursor = conexao.cursor(dictionary=True)

sql = "SELECT id, nome, email, idade FROM usuarios WHERE idade > %s" cursor.execute(sql, (18,))

for usuario in cursor.fetchall(): print(f"{usuario['nome']} — {usuario['email']} — {usuario['idade']} anos")

O parâmetro dictionary=True no mysql-connector-python (equivalente ao DictCursor do PyMySQL) faz com que cada linha seja retornada como um dicionário, facilitando o acesso pelos nomes das colunas.

3. UPDATE — Atualizando Registros

sql = "UPDATE usuarios SET email = %s WHERE id = %s"
cursor.execute(sql, ("[email protected]", 1))
conexao.commit()

print(f"Linhas afetadas: {cursor.rowcount}")

4. DELETE — Removendo Registros

sql = "DELETE FROM usuarios WHERE id = %s"
cursor.execute(sql, (10,))
conexao.commit()

print(f"Linhas removidas: {cursor.rowcount}")

Para cenários mais complexos, como operações que envolvem múltiplas tabelas, confira nosso guia sobre SQLite com Python — os fundamentos de SQL se aplicam igualmente ao MySQL, e os conceitos de transação e commit são idênticos.

Connection Pooling em Python com MySQL

Em aplicações reais, abrir e fechar conexões a cada requisição é ineficiente. O connection pooling mantém um conjunto de conexões reutilizáveis, reduzindo drasticamente a latência e o consumo de recursos.

import mysql.connector.pooling

pool = mysql.connector.pooling.MySQLConnectionPool( pool_name="meu_pool", pool_size=10, pool_reset_session=True, host="localhost", user="root", password="sua_senha", database="meu_banco" )

def buscar_usuario(user_id): conexao = pool.get_connection() cursor = conexao.cursor(dictionary=True) cursor.execute("SELECT * FROM usuarios WHERE id = %s", (user_id,)) usuario = cursor.fetchone() cursor.close() conexao.close() return usuario

O pool gerencia automaticamente a criação e destruição de conexões. Em aplicações web com FastAPI ou Django, você configura o pool uma vez na inicialização e reutiliza em todos os endpoints. A documentação oficial de connection pooling do MySQL detalha todos os parâmetros disponíveis.

Trabalhando com SQLAlchemy e MySQL

Para projetos de médio e grande porte, o SQLAlchemy oferece uma abstração que simplifica drasticamente o trabalho com MySQL. Com ele, você define modelos Python e o ORM gera automaticamente as tabelas e consultas SQL.

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

engine = create_engine( "mysql+pymysql://root:sua_senha@localhost:3306/meu_banco", pool_size=10, max_overflow=20 )

Base = declarative_base()

class Usuario(Base): tablename = "usuarios" id = Column(Integer, primary_key=True, autoincrement=True) nome = Column(String(100), nullable=False) email = Column(String(150), unique=True, nullable=False) idade = Column(Integer)

Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) sessao = Session()

Inserir

novo = Usuario(nome="João", email="[email protected]", idade=32) sessao.add(novo) sessao.commit()

Consultar

usuarios = sessao.query(Usuario).filter(Usuario.idade > 25).all() for u in usuarios: print(f"{u.nome} - {u.email}")

sessao.close()

O SQLAlchemy suporta migration com Alembic, lazy loading, eager loading, joins automatizados e muito mais. Se você está migrando de SQLite para MySQL, a mudança é quase transparente — basta alterar a string de conexão.

Tratamento de Erros e Transações

Toda aplicação robusta precisa lidar com falhas de banco de dados. Em Python, o tratamento é feito com try/except, e as transações garantem a consistência dos dados.

import mysql.connector
from mysql.connector import Error

try: conexao = mysql.connector.connect(**config) cursor = conexao.cursor()

conexao.start_transaction()
cursor.execute("UPDATE contas SET saldo = saldo - 100 WHERE id = 1")
cursor.execute("UPDATE contas SET saldo = saldo + 100 WHERE id = 2")
conexao.commit()
print("Transferência realizada com sucesso!")

except Error as e: conexao.rollback() print(f"Erro na transação: {e}")

finally: if conexao.is_connected(): cursor.close() conexao.close()

O método start_transaction() inicia uma transação explícita. Se qualquer operação falhar, o rollback() reverte todas as alterações, mantendo a integridade dos dados. O tutorial da DigitalOcean sobre MySQL com Python oferece exemplos adicionais de tratamento de erros em cenários reais.

Migrações de Schema com Alembic

Conforme sua aplicação evolui, o schema do banco de dados precisa acompanhar as mudanças. O Alembic é a ferramenta de migração oficial do SQLAlchemy e permite versionar cada alteração na estrutura das tabelas.

pip install alembic
alembic init migrations

Criar uma migração

alembic revision --autogenerate -m "criar_tabela_usuarios"

Aplicar migrações

alembic upgrade head

Com o Alembic, você pode reverter migrações (alembic downgrade), gerar automaticamente scripts a partir dos modelos SQLAlchemy e manter o histórico completo de alterações do banco em arquivos versionados no Git. É uma prática indispensável em projetos mantidos por equipes, pois elimina o problema de schemas divergentes entre ambientes de desenvolvimento, staging e produção.

Usando MySQL com FastAPI de Forma Assíncrona

Para aplicações modernas que exigem alta concorrência, o driver aiomysql oferece operações assíncronas com MySQL, integrando-se perfeitamente com o ecossistema asyncio do Python.

import asyncio
import aiomysql

async def main(): pool = await aiomysql.create_pool( host="localhost", user="root", password="sua_senha", db="meu_banco", minsize=5, maxsize=20 ) async with pool.acquire() as conn: async with conn.cursor() as cursor: await cursor.execute("SELECT COUNT(*) FROM usuarios") total = await cursor.fetchone() print(f"Total de usuários: {total[0]}") pool.close() await pool.wait_closed()

asyncio.run(main())

Combinado com FastAPI, esse padrão permite atender centenas de requisições simultâneas sem bloquear o loop de eventos. Cada requisição adquire uma conexão do pool, executa a consulta e devolve a conexão ao pool de forma eficiente.

Boas Práticas de Segurança

  • Nunca armazene credenciais no código: Use variáveis de ambiente ou arquivos .env. A biblioteca python-dotenv facilita o gerenciamento de configurações.
  • Sempre use placeholders: %s ou ? nos SQL statements evitam injeção SQL. Nunca concatene strings com dados do usuário.
  • SSL/TLS em produção: Configure certificados SSL para criptografar a comunicação entre Python e MySQL, especialmente em conexões remotas.
  • Princípio do menor privilégio: Crie usuários MySQL com permissões específicas para cada aplicação, evitando o uso do usuário root.
  • Valide dados antes de inserir: Use type hints e bibliotecas como Pydantic para validar os dados antes de enviá-los ao banco.

Se você trabalha com múltiplos bancos de dados, nosso guia sobre MongoDB com Python mostra como integrar bancos NoSQL ao lado do MySQL em aplicações híbridas.

Performance e Otimização

Para aplicações com alto volume de requisições, algumas estratégias de performance são essenciais:

  • Connection pooling: Reutilize conexões em vez de criar novas a cada operação.
  • Batch inserts: Use executemany() para inserir múltiplos registros em uma única operação.
  • Índices: Crie índices MySQL nas colunas usadas em cláusulas WHERE e JOIN.
  • Fetch size: Use cursor.fetchmany(tamanho) para processar grandes resultados em lotes.
  • Prepared statements: Reutilize planos de execução para consultas repetitivas.
# Batch insert com executemany
dados = [
    ("Ana", "[email protected]", 25),
    ("Pedro", "[email protected]", 32),
    ("Carla", "[email protected]", 29),
]
cursor.executemany(
    "INSERT INTO usuarios (nome, email, idade) VALUES (%s, %s, %s)",
    dados
)
conexao.commit()
print(f"{cursor.rowcount} registros inseridos.")

Ferramentas e Recursos Adicionais

Além dos conectores padrão, o ecossistema Python oferece ferramentas complementares para trabalhar com MySQL:

  • Alembic: Sistema de migração de schemas que funciona com SQLAlchemy, ideal para versionar alterações no banco de dados.
  • mysqlclient: Driver alternativo baseado em C, mais rápido que PyMySQL em benchmarks de operações intensivas.
  • aiomysql: Versão assíncrona do PyMySQL para uso com asyncio, perfeita para aplicações FastAPI de alta concorrência.
  • SQLAlchemy 2.0: A versão mais recente do ORM traz suporte nativo a async/await e type hints integrados.

Para se aprofundar, recomendamos a leitura da documentação oficial do MySQL, que cobre desde administração até tuning de performance. O tutorial interativo da W3Schools sobre MySQL com Python também é um ótimo recurso para iniciantes praticarem os conceitos básicos.

Conclusão

A integração entre Python e MySQL é robusta, flexível e bem documentada. Neste guia, você aprendeu desde a instalação dos conectores até técnicas avançadas como connection pooling, ORM com SQLAlchemy e boas práticas de segurança. Com esses conhecimentos, você está preparado para construir aplicações Python escaláveis e seguras que utilizam o MySQL como base de dados.

O próximo passo natural é explorar tópicos como migrações de schema com Alembic, replicação MySQL para alta disponibilidade e integração com frameworks web como FastAPI e Django. Continue explorando o Universo Python e aprofunde seus conhecimentos em bancos de dados relacionais e NoSQL com nossos guias gratuitos.

Links internos recomendados: