Как-то так. Пришлось, вроде, еще доставить sqlparser.
from __future__ import unicode_literals
from django.db import migrations
from django.db.utils import NotSupportedError
class SafeRunSQL(migrations.RunSQL):
"""This operation ignores error if trigger exists. Used to avoid problems with existing DB."""
def database_forwards(self, *args, **kwargs):
try:
super(SafeRunSQL, self).database_forwards(*args, **kwargs)
except NotSupportedError:
pass
# `--` after `;` used to fix issue with sqlparser that is used by Django migrations
TRIGGERS = (
("CREATE TRIGGER `my_trigger` AFTER INSERT ...", "DROP TRIGGER IF EXISTS `my_trigger`"),
)
class Migration(migrations.Migration):
dependencies = [
('my_app', '0001_initial'),
]
operations = [
SafeRunSQL(sql, reverse_sql) for sql, reverse_sql in TRIGGERS
]
P.S.: SafeRunSQL - это антипаттерн! Не следует его использовать в каждой миграции, игнорируя ошибки.