#25312: Bug: AutoField backed by Postgres 9+ creates error condition
-------------------------------------+-------------------------------------
     Reporter:  infintesimal         |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Uncategorized        |                  Version:  1.7
     Severity:  Normal               |               Resolution:
     Keywords:  AutoField,           |             Triage Stage:
  Postgres, Sequences                |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by infintesimal):

 * needs_better_patch:   => 0
 * needs_tests:   => 0
 * needs_docs:   => 0


Old description:

> The essence of this bug report is that models.py creates an inherent
> conflict between default, autoincrementing id fields (AutoField) and what
> a postgres 9.x (9.4 in my case) assigns as the type for the auto
> incrementing field. When makemigration creates the sequence, the sequence
> is created as a big integer. However, the database table that uses the
> sequence (the id field) is created as an integer. So once the value of
> the sequence exceeds the maximum value of a 32 bit integer, the insert
> will fail.
>
> Below is models.py code and some psql command line foo to illustrate the
> problem
>
> {{{
> import datetime
> import hashlib
> import os
> from math import sqrt
> from random import Random
> from django.db import models
> from django.db.models.query import Q
> from django.utils.text import slugify
> from djangoratings.fields import RatingField
> from django_pgjson.fields import JsonBField
> from django_images.models import Image as BaseImage
> from django.utils import timezone
>
> class EventName(models.Model):
>   event_name = models.CharField(max_length=500, blank=False, null=False)
>   event_desc = models.CharField(max_length=500, blank=False, null=True)
>   event_creation_date =
> models.DateTimeField(auto_now_add=True,null=False)
>   event_update_date = models.DateTimeField(auto_now=True,null=False)
>
>   def __unicode__(self):
>     return self.name
>
> }}}
>
> {{{
> steves_app=> \d eventlogs_eventname_id_seq
>      Sequence "public.eventlogs_eventname_id_seq"
>     Column     |  Type   |           Value
> ---------------+---------+----------------------------
>  sequence_name | name    | eventlogs_eventname_id_seq
>  last_value    | bigint  | 1
>  start_value   | bigint  | 1
>  increment_by  | bigint  | 1
>  max_value     | bigint  | 9223372036854775807
>  min_value     | bigint  | 1
>  cache_value   | bigint  | 1
>  log_cnt       | bigint  | 0
>  is_cycled     | boolean | f
>  is_called     | boolean | f
> Owned by: public.eventlogs_eventname.id
>
> steves_app=> \d eventlogs_eventname
>                                         Table
> "public.eventlogs_eventname"
>        Column        |           Type           |
> Modifiers
> ---------------------+--------------------------+------------------------------------------------------------------
>  id                  | integer                  | not null default
> nextval('eventlogs_eventname_id_seq'::regclass)
>  event_name          | character varying(500)   | not null
>  event_desc          | character varying(500)   |
>  event_creation_date | timestamp with time zone | not null
>  event_update_date   | timestamp with time zone | not null
> Indexes:
>     "eventlogs_eventname_pkey" PRIMARY KEY, btree (id)
> Referenced by:
>     TABLE "eventlogs_event" CONSTRAINT
> "eventlog_event_id_id_153f5722b6e1dffb_fk_eventlogs_eventname_id" FOREIGN
> KEY (event_id_id) REFERENCES eventlogs_eventname(id) DEFERRABLE INITIALLY
> DEFERRED
>
> fitcode_app=> alter sequence eventlogs_eventname_id_seq restart with
> 4294967297;
> ALTER SEQUENCE
> fitcode_app=> insert into
> eventlogs_eventname(event_name,event_desc,event_creation_date,event_update_date)
> values ('foo','bar',now(),now());
> ERROR:  integer out of range
>
> }}}

New description:

 The essence of this bug report is that models.py creates an inherent
 conflict between default, autoincrementing id fields (AutoField) and what
 a postgres 9.x (9.4 in my case) assigns as the type for the auto
 incrementing field. When makemigration creates the sequence, the sequence
 is created as a big integer. However, the database table that uses the
 sequence (the id field) is created as an integer. So once the value of the
 sequence exceeds the maximum value of a 32 bit integer, the insert will
 fail.

 Below is models.py code and some psql command line foo to illustrate the
 problem

 {{{
 import datetime
 import hashlib
 import os
 from math import sqrt
 from random import Random
 from django.db import models
 from django.db.models.query import Q
 from django.utils.text import slugify
 from djangoratings.fields import RatingField
 from django_pgjson.fields import JsonBField
 from django_images.models import Image as BaseImage
 from django.utils import timezone

 class EventName(models.Model):
   event_name = models.CharField(max_length=500, blank=False, null=False)
   event_desc = models.CharField(max_length=500, blank=False, null=True)
   event_creation_date = models.DateTimeField(auto_now_add=True,null=False)
   event_update_date = models.DateTimeField(auto_now=True,null=False)

   def __unicode__(self):
     return self.name

 }}}

 {{{
 steves_app=> \d eventlogs_eventname_id_seq
      Sequence "public.eventlogs_eventname_id_seq"
     Column     |  Type   |           Value
 ---------------+---------+----------------------------
  sequence_name | name    | eventlogs_eventname_id_seq
  last_value    | bigint  | 1
  start_value   | bigint  | 1
  increment_by  | bigint  | 1
  max_value     | bigint  | 9223372036854775807
  min_value     | bigint  | 1
  cache_value   | bigint  | 1
  log_cnt       | bigint  | 0
  is_cycled     | boolean | f
  is_called     | boolean | f
 Owned by: public.eventlogs_eventname.id

 steves_app=> \d eventlogs_eventname
                                         Table "public.eventlogs_eventname"
        Column        |           Type           |
 Modifiers
 
---------------------+--------------------------+------------------------------------------------------------------
  id                  | integer                  | not null default
 nextval('eventlogs_eventname_id_seq'::regclass)
  event_name          | character varying(500)   | not null
  event_desc          | character varying(500)   |
  event_creation_date | timestamp with time zone | not null
  event_update_date   | timestamp with time zone | not null
 Indexes:
     "eventlogs_eventname_pkey" PRIMARY KEY, btree (id)
 Referenced by:
     TABLE "eventlogs_event" CONSTRAINT
 "eventlog_event_id_id_153f5722b6e1dffb_fk_eventlogs_eventname_id" FOREIGN
 KEY (event_id_id) REFERENCES eventlogs_eventname(id) DEFERRABLE INITIALLY
 DEFERRED

 steves_app=> alter sequence eventlogs_eventname_id_seq restart with
 4294967297;
 ALTER SEQUENCE
 steves_app=> insert into
 
eventlogs_eventname(event_name,event_desc,event_creation_date,event_update_date)
 values ('foo','bar',now(),now());
 ERROR:  integer out of range

 }}}

--

--
Ticket URL: <https://code.djangoproject.com/ticket/25312#comment:1>
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/070.5d92d1da06116d05bc076e6c059052da%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to