mirror of https://github.com/interlegis/sapl.git
committed by
GitHub
4 changed files with 137 additions and 4 deletions
@ -0,0 +1,43 @@ |
|||||
|
from django.db import migrations |
||||
|
|
||||
|
|
||||
|
class AddConstraintSeAusente(migrations.AddConstraint): |
||||
|
""" |
||||
|
AddConstraint que aproveita um índice já existente com o mesmo nome, desde |
||||
|
que ele seja único, válido e sobre as mesmas colunas. Se não for, falha em |
||||
|
vez de registrar no estado do Django uma constraint que o banco não aplica. |
||||
|
|
||||
|
Antes de serem renumeradas no #3855, as migrations 0071 e 0072 se chamavam |
||||
|
0070_votoparlamentar_unique_constraint e |
||||
|
0071_votacao_aberta_unique_constraint e chegaram a ser aplicadas em alguns |
||||
|
bancos de produção. Eles já têm os índices, mas não registram as migrations |
||||
|
com os nomes atuais, e o AddConstraint puro falharia com DuplicateTable. |
||||
|
""" |
||||
|
|
||||
|
def database_forwards(self, app_label, schema_editor, from_state, |
||||
|
to_state): |
||||
|
model = to_state.apps.get_model(app_label, self.model_name) |
||||
|
nome = self.constraint.name |
||||
|
connection = schema_editor.connection |
||||
|
with connection.cursor() as cursor: |
||||
|
existente = connection.introspection.get_constraints( |
||||
|
cursor, model._meta.db_table).get(nome) |
||||
|
if existente is not None: |
||||
|
cursor.execute( |
||||
|
'SELECT indisvalid FROM pg_index ' |
||||
|
'WHERE indexrelid = %s::regclass', [nome]) |
||||
|
existente['valid'] = cursor.fetchone()[0] |
||||
|
|
||||
|
if existente is None: |
||||
|
super().database_forwards( |
||||
|
app_label, schema_editor, from_state, to_state) |
||||
|
return |
||||
|
|
||||
|
colunas = [model._meta.get_field(campo).column |
||||
|
for campo in self.constraint.fields] |
||||
|
if not (existente['unique'] and existente['valid'] and |
||||
|
existente['columns'] == colunas): |
||||
|
raise ValueError( |
||||
|
'O índice "{}" já existe, mas não é o índice único e válido ' |
||||
|
'sobre ({}) esperado pela constraint. Remova-o e rode o ' |
||||
|
'migrate de novo.'.format(nome, ', '.join(colunas))) |
||||
Loading…
Reference in new issue