Как временно отключить ограничения целостности БД в django - postgresql - PullRequest
0 голосов
/ 11 октября 2018

Я пишу команду Django для заполнения существующей таблицы,

Мне нужно обрезать таблицу перед заполнением, но для этой таблицы есть ограничения внешнего ключа.

из-за этого я получаю django.db.utils.IntegrityError при усечении таблицы,

Как временно отключить проверки внешнего ключа в Django?

Я видел SET FOREIGN KEY CHECK = 0, но не знаю, где их разместить: (

Класс команды Django:

class Command(BaseCommand):
help = "Command to seed the aws regions"
regions = [
    {
        'name': 'Us East (N. Virginia)',
        'region': 'us-east-1',
    },
    {
        'name': 'US West (Oregon)',
        'region': 'us-west-2',
    },
    {
        'name': 'EU (Ireland)',
        'region': 'eu-west-1',
    },
]
def handle(self, *args, **options):
    self.stdout.write('seeding regions...')

    AwsRegions.objects.all().delete() # this is where i get errors

    for name, region in self.regions:
        self.stdout.write(region)
        AwsRegions.objects.create(name, region)


    self.stdout.write('done seeding regions')

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Чтобы отключить триггеры для всех таблиц (полезно, когда вам нужно остановить его для нескольких таблиц):

SET session_replication_role TO 'replica'

И восстановить:

SET session_replication_role TO 'origin'
0 голосов
/ 11 октября 2018

Получил решение.

Мне пришлось отключить триггеры в таблице, чтобы остановить проверку ограничения внешнего ключа.

Отключить триггеры

def disable_triggers(self):
        with connection.cursor() as cursor:
            cursor.execute('ALTER TABLE "Table Name" DISABLE TRIGGER ALL;')

Включить триггеры

def enable_triggers(self):
    with connection.cursor() as cursor:
        cursor.execute('ALTER TABLE "Table Name" ENABLE TRIGGER ALL;')

Важные примечания :

  • Согласно этой ссылке документа , вы можете передать список в качестве второго аргумента методу execute() (например: вам может потребоваться передать имя таблицы динамически), но это автоматически исключит переменные, и вы можете в конечном итоге сформировать синтаксически неправильный запрос PostgreSQL(что заняло у меня много времени, чтобы исправить это)

  • Убедитесь, что вы снова включили триггеры правильно

  • Если вы получаете Ошибка «Отказано в доступе» Тогда, возможно, вы захотите проверить разрешения пользователя БД, я просто включил права суперпользователя от PgAdmin, что было хорошо для меня.и все возвращается к работе. Как это сделать?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...