Browse Source

Usa bulk_create para a migração de dados

pull/1847/head
Marcio Mazza 7 years ago
parent
commit
419348e4df
  1. 43
      sapl/legacy/migracao_dados.py

43
sapl/legacy/migracao_dados.py

@ -796,6 +796,7 @@ class DataMigrator:
# convert old records to new ones
with transaction.atomic():
novos = []
sql_delete_legado = ''
for old in old_records:
new = model()
@ -812,12 +813,9 @@ class DataMigrator:
else:
if get_id_do_legado:
new.id = get_id_do_legado(old)
# validação do model
new.clean()
# salva novo registro
with reversion.create_revision():
new.save()
reversion.set_comment('Objeto criado pela migração')
new.clean() # valida model
novos.append(new) # guarda para salvar
# acumula deleção do registro no legado
sql_delete_legado += 'delete from {} where {};\n'.format(
@ -827,8 +825,11 @@ class DataMigrator:
getattr(old, campo))
for campo in campos_pk))
if ajuste_depois_salvar:
ajuste_depois_salvar(new, old)
# salva novos registros
model.objects.bulk_create(novos)
if ajuste_depois_salvar:
ajuste_depois_salvar()
# se configuramos ids explicitamente devemos reiniciar a sequence
if get_id_do_legado:
@ -1067,20 +1068,26 @@ def adjust_normajuridica_antes_salvar(new, old):
new.esfera_federacao = ''
def adjust_normajuridica_depois_salvar(new, old):
def adjust_normajuridica_depois_salvar():
# Ajusta relação M2M
ligacao = NormaJuridica.assuntos.through
if not old.cod_assunto: # it can be null or empty
return
def gen_ligacoes():
from sapl.legacy.models import NormaJuridica as OldNormaJuridica
# lista de pks separadas por vírgulas (ignorando strings vazias)
lista_pks_assunto = [int(pk) for pk in old.cod_assunto.split(',') if pk]
assuntos_migrados, normas_migradas = [
set(model.objects.values_list('id', flat=True))
for model in [AssuntoNorma, NormaJuridica]]
for pk_assunto in lista_pks_assunto:
try:
new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto))
except ObjectDoesNotExist:
pass # ignora assuntos inexistentes
for norma, cod_assunto in OldNormaJuridica.objects.filter(
pk__in=normas_migradas).values_list('pk', 'cod_assunto'):
assuntos = [a for a in map(int, cod_assunto.split(','))
if a in assuntos_migrados]
for assunto in assuntos:
yield ligacao(normajuridica_id=norma, assuntonorma_id=assunto)
ligacao.objects.bulk_create(gen_ligacoes())
def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome):

Loading…
Cancel
Save