#27996: Add pgcrypto extension  and GEN_RANDOM_UUID function to contrib.postgres
-------------------------------------+-------------------------------------
     Reporter:  Paolo Melchiorre     |                    Owner:  Paolo
                                     |  Melchiorre
         Type:  New feature          |                   Status:  assigned
    Component:  contrib.postgres     |                  Version:  master
     Severity:  Normal               |               Resolution:
     Keywords:  uuid extension       |             Triage Stage:  Accepted
  function random postgresql         |
  cryptography                       |
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Paolo Melchiorre:

Old 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.

New 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 changing it 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.

--

--
Ticket URL: <https://code.djangoproject.com/ticket/27996#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.f39895ce3a5fc9c95619922012bc200e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to