Browse Source

Adiciona ressuscitar fks faltando apagadas na producao

migracao
Marcio Mazza 6 years ago
parent
commit
d9ad4f1606
  1. 95
      sapl/legacy/migracao_dados.py
  2. 50
      sapl/legacy/scripts/ressuscita_dependencias.py

95
sapl/legacy/migracao_dados.py

@ -1029,10 +1029,13 @@ def roda_comando_shell(cmd):
assert res == 0, "O comando falhou: {}".format(cmd) assert res == 0, "O comando falhou: {}".format(cmd)
def get_arquivo_ajustes_pre_migracao(): def get_arquivos_ajustes_pre_migracao():
return DIR_DADOS_MIGRACAO.child( return [
"ajustes_pre_migracao", "{}.sql".format(SIGLA_CASA) DIR_DADOS_MIGRACAO.child(
) "ajustes_pre_migracao", f"{SIGLA_CASA}.{sufixo}"
)
for sufixo in ("sql", "reverter.yaml")
]
def do_flush(): def do_flush():
@ -1070,9 +1073,13 @@ def migrar_dados(flush=False, apagar_do_legado=False):
exec_legado('SET SESSION sql_mode = "NO_AUTO_VALUE_ON_ZERO";') exec_legado('SET SESSION sql_mode = "NO_AUTO_VALUE_ON_ZERO";')
# executa ajustes pré-migração, se existirem # executa ajustes pré-migração, se existirem
arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() arq_ajustes_sql, arq_ajustes_reverter = (
if arq_ajustes_pre_migracao.exists(): get_arquivos_ajustes_pre_migracao()
exec_legado(arq_ajustes_pre_migracao.read_file()) )
if arq_ajustes_sql.exists():
exec_legado(arq_ajustes_sql.read_file())
if arq_ajustes_reverter.exists():
revert_delete_producao(yaml.load(arq_ajustes_reverter.read_file()))
primeira_migracao = not AppConf.objects.exists() primeira_migracao = not AppConf.objects.exists()
@ -1812,35 +1819,45 @@ def gravar_marco(
REPO.git.execute("git tag -f".split() + [TAG_MARCO]) REPO.git.execute("git tag -f".split() + [TAG_MARCO])
def apaga_do_legado_apagados_em_producao_das_ocorrencias_fk_faltando(): def encode_version(version):
info_tabelas_legado = {} return {
for model in get_models_a_migrar(): "content_type__model": version.content_type.model,
model_legado, tabela_legado, _ = get_estrutura_legado(model) "object_id": version.object_id,
info_tabelas_legado[tabela_legado] = (model_legado, model) }
fks, sql = ocorrencias["fk"], []
for fk in fks: def get_apagados_que_geram_ocorrencias_fk(fks_faltando):
model_legado, model = info_tabelas_legado[fk["tabela"]] def get_tabela_legado_do_model(model):
nome_campo_novo = {v: k for k, v in field_renames[model].items()}[ _, tabela_legado, _ = get_estrutura_legado(model)
fk["campo"] return tabela_legado
]
campo_novo = model._meta.get_field(nome_campo_novo) tabela_legado_p_model = {
_, tabela, [nome_pk] = get_estrutura_legado(campo_novo.related_model) get_tabela_legado_do_model(model): model
sql.append( for model in get_models_a_migrar()
f"update {tabela} set ind_excluido = 2 where {nome_pk} = {fk['valor']};" # noqa }
)
sql = "\n".join(set(sql)) apagados = set()
sql = f""" for fk in fks_faltando:
/* Ajuste necessário na migração corretiva: model_dependente = tabela_legado_p_model[fk["tabela"]]
Estes registros foram: nome_campo_fk = {
* migrados anteriormente (na primeira migração) v: k for k, v in field_renames[model_dependente].items()
* apagados na produção }[fk["campo"]]
* e agora geram FKs órfãs ao tentar a migração corretiva. campo_fk = model_dependente._meta.get_field(nome_campo_fk)
model_relacionado = campo_fk.related_model
Solução: apagar também previamente no legado _, tabela_relacionada, _ = get_estrutura_legado(model_relacionado)
na esperança que as propagações de exclusões que rodam na pré-migração deleted = Version.objects.get_deleted(model_relacionado)
possam apagar também os registros que por isso acabaram órfãos version = deleted.get(object_id=fk["valor"])
*/ apagados.add((tabela_relacionada, version))
{sql} return [
""" (tabela_relacionada, encode_version(version))
return sql for tabela, version in apagados
]
def revert_delete_producao(dados_versions):
print("Revertendo registros apagados em produção...")
for dados in dados_versions:
print(dados)
version = Version.objects.get(**dados)
version.revert()
print("... sucesso")

50
sapl/legacy/scripts/ressuscita_dependencias.py

@ -1,13 +1,15 @@
from collections import OrderedDict from collections import OrderedDict
from textwrap import dedent from textwrap import dedent
import pyaml
import texttable import texttable
import yaml import yaml
from unipath import Path from unipath import Path
from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO, from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO,
campos_novos_para_antigos, exec_legado, campos_novos_para_antigos, exec_legado,
get_arquivo_ajustes_pre_migracao, get_apagados_que_geram_ocorrencias_fk,
get_arquivos_ajustes_pre_migracao,
models_novos_para_antigos) models_novos_para_antigos)
from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO,
NOME_BANCO_LEGADO) NOME_BANCO_LEGADO)
@ -218,11 +220,15 @@ Para facilitar sua conferência, seguem os links para as proposições envolvida
) )
def get_dependencias_a_ressuscitar(slug): def get_fks_faltando():
ocorrencias = yaml.load( ocorrencias = yaml.load(
Path(DIR_REPO.child("ocorrencias.yaml").read_file()) Path(DIR_REPO.child("ocorrencias.yaml").read_file())
) )
fks_faltando = ocorrencias.get("fk") return ocorrencias.get("fk", [])
def get_dependencias_a_ressuscitar(slug):
fks_faltando = get_fks_faltando()
if not fks_faltando: if not fks_faltando:
return [], [], [] return [], [], []
@ -505,9 +511,39 @@ def get_slug():
return siglas_para_slugs[sigla] return siglas_para_slugs[sigla]
def acrescenta_ao_arquivo_de_ajustes(texto):
texto = texto.strip()
if texto:
arq_ajustes_sql, _ = get_arquivos_ajustes_pre_migracao()
conteudo = arq_ajustes_sql.read_file()
arq_ajustes_sql.write_file(f"{conteudo}\n{texto}")
def adiciona_ressuscitar(): def adiciona_ressuscitar():
sqls = get_ressuscitar(get_slug()) sqls = get_ressuscitar(get_slug())
if sqls.strip(): acrescenta_ao_arquivo_de_ajustes(sqls)
arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao()
conteudo = arq_ajustes_pre_migracao.read_file()
arq_ajustes_pre_migracao.write_file("{}\n{}".format(conteudo, sqls)) def adiciona_ressuscitar_apagados_em_producao():
fks_faltando = get_fks_faltando()
apagados = get_apagados_que_geram_ocorrencias_fk(fks_faltando)
reverter = []
links = []
for (tabela, version_data) in apagados:
reverter.append(version_data)
links.append(get_link(tabela, version_data["object_id"], get_slug()))
_, arq_revert = get_arquivos_ajustes_pre_migracao()
arq_revert.write_file(pyaml.dump(reverter))
links = "\n".join(links)
acrescenta_ao_arquivo_de_ajustes(
f"""
/* RESSUSCITADOS
Apagados no sapl 3.1 que precisaram ser restaurados:
{links}
*/
"""
)

Loading…
Cancel
Save