Alembic
Alembic é um pacote responsável pela gestão de migrações de banco de dados em aplicações Python.
Instalação
Instale o pacote Alembic usando o seguinte comando:
pip install alembic
Configuração
Gere um arquivo de configuração para o Alembic:
alembic init alembic
Isso criará um diretório chamado "alembic" com arquivos de configuração.
Configurando arquivo env.py
Dentro do diretório "alembic" no arquivo env.py. Nesse caso, essas configurações fazem necessárias, pois é usado o comando autogenerate
para gerar o arquivo de migração.
1. Configurando a URL do banco de dados:
from core.database import SQLALCHEMY_DATABASE_URI
config = context.config
config.set_main_option("sqlalchemy.url", SQLALCHEMY_DATABASE_URI)
2. Importar os models da API:
import importlib
models = [
'app.modulo.models.NomeModels',
]
for model in models:
try:
model_path, class_name = model.rsplit('.', 1)
module = importlib.import_module(model_path)
except ImportError:
print(f"Error importing model: {model}")
3. Definindo o Metadata dos models:
from core.database import Base
target_metadata = Base.metadata
4. Incluindo apenas tabelas dos módulos mapeados:
def include_name(name, type_, parent_names):
if type_ == "table":
return name in target_metadata.tables
return True
E na função run_migrations_online
(gerada pelo alembic), adicione a função include_name
, como:
def run_migrations_online():
...
with connectable.connect() as connection:
context.configure(
...
include_name=include_name,
...
)
5. Omitir models do processo de migração:
def include_object(object, name, type_, reflected, compare_to):
if object.info.get("skip_autogenerate", False):
return False
return True
E também inclua include_object=include_object
na função run_migrations_online
, por exemplo:
def run_migrations_online():
...
with connectable.connect() as connection:
context.configure(
...
include_object=include_object,
...
)
Omitindo models na migração
Por exemplo, se você não quiser incluir o model de Usuário, adicione o seguinte código:
class Usuario(CoreBase):
__table_args__ = {'info': {'skip_autogenerate': True}}
...
e certifique de ter implementado, também, o seguinte código no item 5.
Executando migrações (Comandos)
1. Criando migrações:
Gerando arquivo de migração automaticamente baseado nos models identificados no item 3.
alembic revision --autogenerate -m "nome_da_migracao"
2. Aplicando as migrações sem autogenerate
:
Gera um arquivo de migração que manualmente pode ser alterado adicionando alterações de downgrade e upgrade.
alembic revision -m "nome_da_migracao"
3. Aplicando as migrações:
alembic upgrade head
4. Desfazendo migração:
Para desfazer a última migração use:
alembic downgrade -1
Para desfazer uma migração específica:
alembic downgrade nome_da_migração
Note
Sugerimos que os nomes dos arquivos de migração tenham alguma forma de identificar a ordem das migrações, no seguinte padrão:
chave-migração_numero-da-migração_nome.py
8380654eebbd_third_migration_data-user.py
Documentação Alembic
Para obter mais informações consulte a documentação do Alembic