Opened 7 years ago

Last modified 4 years ago

#27996 closed New feature

Add pgcrypto extension and GEN_RANDOM_UUID function to contrib.postgres — at Initial Version

Reported by: Paolo Melchiorre Owned by: Paolo Melchiorre
Component: contrib.postgres Version: dev
Severity: Normal Keywords: uuid extension function random postgresql cryptography
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

After the introduction of the UUID Field in Django 1.8, I believe that django.contrib.postgres could benefit from some custom functions based on the pgcrypto extension of PostgreSQL (see https://www.postgresql.org/docs/9.6/static/pgcrypto.html). That kind of functions would be very helpful for apply a migration that adds a unique non-nullable field to a table with existing rows.

Starting from "Migrations that add unique fields" (see https://docs.djangoproject.com/en/dev/howto/writing-migrations/#migrations-that-add-unique-fields) I speed up the gen_uuid using GEN_RANDOM_UUID function, I change the function from:

import uuid

def gen_uuid(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    for row in MyModel.objects.all():
        row.uuid = uuid.uuid4()
        row.save(update_fields=['uuid'])

to

from django.contrib.postgres.functions import RandomUUID

def gen_uuid(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    MyModel.objects.update(uuid=RandomUUID())

Using this function on my system the time to migrate more than 10000 objects decreased from

real 0m15.988s
user 0m10.680s
sys 0m0.508s

to

real 0m2.957s
user 0m1.736s
sys 0m0.072s

I already implemented a solution for thi feature and I'm crating a related pull request.

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top