我正在编写一个 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)
得到了解决方案。
我不得不禁用表上的触发器以停止外键约束检查。
禁用触发器
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 查询(这花了我很多时间来修复它)
确保正确打开触发器