Restarting the id sequence for postgresql

This commit is contained in:
FinnStutzenstein 2019-07-23 13:54:48 +02:00
parent 60098af22d
commit 408ef6d3f2
4 changed files with 42 additions and 9 deletions

17
openslides/users/db.py Normal file
View File

@ -0,0 +1,17 @@
from django.db import connection
def postgres_restart_auth_group_id_sequence(*args, **kwargs):
"""
This function resets the id sequence from the auth_group table (the current auto
increment value for the id field) to the max_id+1. This is needed, when inserting
groups by id, because Postgresql does not update the id sequence.
"""
if connection.vendor == "postgresql":
with connection.cursor() as cursor:
cursor.execute("SELECT max(id) + 1 as max FROM auth_group;")
max_id = cursor.fetchone()[0]
if max_id is not None:
cursor.execute(
f"ALTER SEQUENCE auth_group_id_seq RESTART WITH {max_id};"
)

View File

@ -14,6 +14,9 @@ def create_superadmin_group(apps, schema_editor):
- If a group with the name 'Admin' (probably with pk = 4) exists, move all - If a group with the name 'Admin' (probably with pk = 4) exists, move all
users from it to the new superadmin group and delete it. If not, check for users from it to the new superadmin group and delete it. If not, check for
the staff group and assign all users to the superadmin group. the staff group and assign all users to the superadmin group.
In 0011_postgres_auth_group_id_sequence, the id sequence for this migration is
restarted when using postgresql.
""" """
Group = apps.get_model("users", "Group") Group = apps.get_model("users", "Group")

View File

@ -0,0 +1,19 @@
# Generated by Finn Stutzenstein on 2019-07-23 13:37
from django.db import migrations
from openslides.users.db import postgres_restart_auth_group_id_sequence
class Migration(migrations.Migration):
"""
When migrating old databases (especially after 0007_superadmin) the id sequence
in postgres needs to be restarted.
This is a additional migration to 0007_superadmin. If a later migration does
something with changing groups in the database, this method needs to run again.
"""
dependencies = [("users", "0010_auto_20190119_1447")]
operations = [migrations.RunPython(postgres_restart_auth_group_id_sequence)]

View File

@ -1,9 +1,9 @@
from django.apps import apps from django.apps import apps
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.db import connection
from django.db.models import Q from django.db.models import Q
from ..utils.auth import GROUP_ADMIN_PK, GROUP_DEFAULT_PK from ..utils.auth import GROUP_ADMIN_PK, GROUP_DEFAULT_PK
from .db import postgres_restart_auth_group_id_sequence
from .models import Group, User from .models import Group, User
@ -185,11 +185,5 @@ def create_builtin_groups_and_admin(**kwargs):
# added to the group. But we do not have to update the cache by calling # added to the group. But we do not have to update the cache by calling
# inform_changed_data() because the cache is updated on server start. # inform_changed_data() because the cache is updated on server start.
# For postgres, the id sequence (the current auto increment value for the id field) # For postgres: After inserting the gorups by id, the id sequence needs to be restarted.
# needs to be refreshed after inserting the groups per id, because postgres does not postgres_restart_auth_group_id_sequence()
# increment the sequence then.
if connection.vendor == "postgresql":
with connection.cursor() as cursor:
cursor.execute("SELECT max(id) + 1 as max FROM auth_group;")
max_id = cursor.fetchone()[0]
cursor.execute(f"ALTER SEQUENCE auth_group_id_seq RESTART WITH {max_id};")