gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:12:48 26 4
gpt4 key购买 nike

我正在编写一个 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')

最佳答案

得到解决方案。

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

禁用触发器

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;')

重要提示:

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

  • 确保正确打开触发器

  • 如果您遇到Permission denied 错误 那么您可能想要检查数据库用户权限,我刚刚从 PgAdmin 打开了 super 用户权限,这是对我来说还可以。一切恢复正常。 How to do it ?

关于django - 我如何暂时禁用 django 中的数据库完整性约束 - postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52767335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com