我如何暂时禁用 django 中的数据库完整性约束 - postgresql

Sho*_*obi 6 django postgresql

我正在编写一个 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')
Run Code Online (Sandbox Code Playgroud)

Sho*_*obi 6

得到了解决方案。

我不得不禁用表上的触发器以停止外键约束检查。

禁用触发器

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

启用触发器

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

重要说明

  • 根据此文档链接,您可以将列表作为第二个参数传递给该execute()方法(例如:您可能希望动态传递表名),但这将自动转义变量,您最终可能会形成语法错误的 PostgreSQL 查询(这花了我很多时间来修复它)

  • 确保正确打开触发器

  • 如果您收到Permission denied 错误 那么您可能想要检查 DB 用户权限,我刚刚从 PgAdmin 打开了超级用户权限,这对我来说没问题。一切都恢复正常。怎么做 ?