Browse Source

Pula registros já migrados

migracao
Marcio Mazza 6 years ago
parent
commit
40825fa416
  1. 2
      sapl/legacy/migracao.py
  2. 68
      sapl/legacy/migracao_dados.py
  3. 3
      sapl/legacy/scripts/restaura_da_producao.sh

2
sapl/legacy/migracao.py

@ -18,7 +18,7 @@ def adornar_msg(msg):
return '\n{1}\n{0}\n{1}'.format(msg, '#' * len(msg))
def migrar(apagar_do_legado=False):
def migrar(flush=False, apagar_do_legado=False):
if TAG_MARCO in REPO.tags:
info('A migração já está feita.')
return

68
sapl/legacy/migracao_dados.py

@ -188,6 +188,10 @@ def get_pk_legado(tabela):
# adaptação para deleção correta no mysql ao final de migrar_model
# acompanha o agrupamento de despacho_inicial feito em iter_sql_records
return 'cod_materia', 'cod_comissao'
elif tabela == 'mesa_sessao_plenaria':
# retiramos 'cod_sessao_leg' redundante que da problema
# ao verificar se o registro já está migrado
return 'cod_cargo', 'cod_parlamentar', 'cod_sessao_plen'
res = exec_legado(
'show index from {} WHERE Key_name = "PRIMARY"'.format(tabela))
return [r[4] for r in res]
@ -235,17 +239,21 @@ class ForeignKeyFaltando(ObjectDoesNotExist):
('sql', sql)))
def get_all_ids_from_model(model):
return set(model.objects.values_list('id', flat=True))
@lru_cache()
def _get_all_ids_from_model(model):
def _cached_get_all_ids_from_model(model):
# esta função para uso apenas em get_fk_related
return set(model.objects.values_list('id', flat=True))
return get_all_ids_from_model(model)
def get_fk_related(field, old):
valor = getattr(old, campos_novos_para_antigos[field])
if valor is None and field.null:
return None
if valor in _get_all_ids_from_model(field.related_model):
if valor in _cached_get_all_ids_from_model(field.related_model):
return valor
elif valor == 0 and field.null:
# consideramos zeros como nulos, se não está entre os ids anteriores
@ -797,6 +805,9 @@ def fill_vinculo_norma_juridica():
def fill_dados_basicos():
if AppConf.objects.exists():
# se estamos refazendo a migração não recriamos o appconf
return
# Ajusta sequencia numérica de protocolo e cria base.AppConfig
if (TipoNumeracaoProtocolo._meta.db_table in TABELAS_LEGADO
and TipoNumeracaoProtocolo.objects.exists()):
@ -872,7 +883,18 @@ def get_arquivo_ajustes_pre_migracao():
'ajustes_pre_migracao', '{}.sql'.format(SIGLA_CASA))
def migrar_dados(apagar_do_legado=False):
def do_flush():
# excluindo database antigo.
info('Excluindo entradas antigas do banco destino.')
FlushCommand().handle(database='default', interactive=False, verbosity=0)
# apaga tipos de autor padrão (criados no flush acima)
TipoAutor.objects.all().delete()
fill_vinculo_norma_juridica()
def migrar_dados(flush=False, apagar_do_legado=False):
try:
ocorrencias.clear()
ocorrencias.default_factory = list
@ -896,16 +918,10 @@ def migrar_dados(apagar_do_legado=False):
uniformiza_banco()
# excluindo database antigo.
info('Excluindo entradas antigas do banco destino.')
flush = FlushCommand()
flush.handle(database='default', interactive=False, verbosity=0)
# apaga tipos de autor padrão (criados no flush acima)
TipoAutor.objects.all().delete()
fill_vinculo_norma_juridica()
if flush:
do_flush()
fill_dados_basicos()
info('Começando migração: ...')
migrar_todos_os_models(apagar_do_legado)
except Exception as e:
@ -970,7 +986,9 @@ def migrar_model(model, apagar_do_legado):
get_estrutura_legado(model)
if len(campos_pk_legado) == 1:
# a pk no legado tem um único campo
# A PK NO LEGADO TEM UM ÚNICO CAMPO
nome_pk = model_legado._meta.pk.name
if 'ind_excluido' in {f.name for f in model_legado._meta.fields}:
# se o model legado tem o campo ind_excluido
@ -983,12 +1001,29 @@ def migrar_model(model, apagar_do_legado):
def get_id_do_legado(old):
return getattr(old, nome_pk)
ids_ja_migrados = get_all_ids_from_model(model)
def ja_esta_migrado(old):
id = get_id_do_legado(old)
return id in ids_ja_migrados
ultima_pk_legado = model_legado.objects.all().aggregate(
Max('pk'))['pk__max'] or 0
else:
# a pk no legado tem mais de um campo
# A PK NO LEGADO TEM MAIS DE UM CAMPO
old_records = iter_sql_records(tabela_legado)
get_id_do_legado = None
renames = field_renames[model]
campos_velhos_p_novos = {v: k for k, v in renames.items()}
def ja_esta_migrado(old):
chave = {campos_velhos_p_novos[c]: getattr(old, c)
for c in campos_pk_legado}
return model.objects.filter(**chave).exists()
ultima_pk_legado = model_legado.objects.count()
ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model)
@ -999,6 +1034,9 @@ def migrar_model(model, apagar_do_legado):
novos = []
sql_delete_legado = ''
for old in old_records:
if ja_esta_migrado(old):
# pulamos esse objeto, pois já foi migrado anteriormente
continue
new = model()
if get_id_do_legado:
new.id = get_id_do_legado(old)

3
sapl/legacy/scripts/restaura_da_producao.sh

@ -1,9 +1,10 @@
set -e # Exit immediately if a command exits with a non-zero status
echo $HOME
echo "Database $1"
echo "Restaurando banco $1..."
sudo -u postgres psql -c "drop DATABASE if exists $1"
sudo -u postgres psql -c "CREATE DATABASE $1 WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1 TEMPLATE template0;"
sudo -u postgres pg_restore -d $1 -U postgres "$HOME/migracao_sapl/dumps_producao/$1.prod"
echo "... restaurado"

Loading…
Cancel
Save