Problemas com migrações
Neste artigo vamos falar sobre migrações no Web2py.
Todos sabemos que o W2P faz proezas com a DAL mas as vezes temos alguns percalços no caminho.
Para fazer o controle do estado das migrações é criado por padrão na pasta databases alguns arquivos com a extensão '.table'.
Esses arquivos são responsáveis por armazenar o estado atual da tabela e logo eles são modificados quando fazemos alterações na definição de tabela no código python.
De fato esses arquivos são muito úteis porém há momentos em que eles começam a dar problemas.
Primeiro de tudo vamos começar mudando nosso código na função define_table passando um argumento migrate='nome_tabela.table'.
Isso fará com que o arquivo .table da tabela1 contenha seu nome, isso facilita evita aqueles arquivos redundantes no diretório.
O próximo passo é entender como funcionam as migrações do construtor DAL.
Isso foi retirado da docstring da pydal do Web2py (gluon.packages.base.py).
migrate: Determina a migração padrão para todas as tabelas se True, no nosso caso estamos usando um migrate customizado em nosso define_table, então pode alterá-lo para False.
fake_migrate: Ele utiliza o padrão False, ele será usado para tratar migrações individuais em bancos de dados legados.
migrate_enabled: Habilita as migrações, seu padrão é True.
fake_migrate_all: É utilizado em bancos legados e atribui um tratamento padrão para todas as tabelas.
O exemplo acima seria a configuração padrão para criar um banco de dados do zero. Ou seja ele iria criar as tabelas para nós utilizando um .table customizado.
Caso ele retorne algum erro de cara, execute a aplicação quantas vezes precisar até que ele crie todas as tabelas e arquivos.
NOTA: Muito cuidado com campos notnull=True geralmente eles não são criados por exigirem sempre um valor padrão, então o notnull=True deve vir acompanhado de um default='anyway'.
<class 'gluon.contrib.pg8000.ProgrammingError'> ('ERRO', '23502', 'valor nulo na coluna "colunaXYZ" viola a restrição não-nula')
Em bases Legadas ou estruturas já criadas
Haverão casos onde precisamos lidar com estruturas legadas ou já criadas, nesse caso podem haver problemas como:
<class 'gluon.contrib.pg8000.ProgrammingError'> ('ERRO', '42701', 'coluna "colunaXYZ" da relação "tableZYX" já existe')
Depois retorne o parâmetro fake_migrate_all para False.
Espero ter sanado as duvidas dos novatos por que ninguém merece perder todo um dia de trabalho fazendo migrações manuais na base de dados.💀
Comentários
Postar um comentário