Flush contenttypes and auth permissions in Django
Published on December 4th, 2022
I was trying to migrate from MySQL to PostgreSQL using loaddata and dumpdata. For this to work, everything needs to be flushed, but the command:
python manage.py sqlflush --database=postgresql
Flush everything except the contenttypes and a few other (mainly auth related) tables.
So we inevitably end up with conflicts and errors:
IntegrityError: (1062, "Duplicate entry '...' for key 2")
The solution is to manually run the SQL in the postgres shell:
TRUNCATE "django_content_type" CASCADE;
We use CASCADE because django_content_type referenced in a foreign key constraint in auth_permission, which is referenced in auth_group_permissions, etc.
Note:
Access the postgres shell with the Django management command:
python manage.py dbshell --database=postgresql
Unless you are in an environment where you don't have access to psql such as Docker.
In Docker you would run:
# Get the CONTAINER ID of postgresql
docker ps
# Open a bash
docker exec -it 04cd7d7c20e9 bash
# Invoke the database shell
psql -U postgres
# Run the command
TRUNCATE "django_content_type" CASCADE;