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
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.
In 0011_postgres_auth_group_id_sequence, the id sequence for this migration is
restarted when using postgresql.
"""
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.contrib.auth.models import Permission
from django.db import connection
from django.db.models import Q
from ..utils.auth import GROUP_ADMIN_PK, GROUP_DEFAULT_PK
from .db import postgres_restart_auth_group_id_sequence
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
# 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)
# needs to be refreshed after inserting the groups per id, because postgres does not
# 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};")
# For postgres: After inserting the gorups by id, the id sequence needs to be restarted.
postgres_restart_auth_group_id_sequence()