Opened 106 minutes ago

Last modified 53 minutes ago

#35916 new Uncategorized

Docs for "Automatic primary key fields" should mention surprising behavior

Reported by: Eric Hanchrow Owned by:
Component: Documentation Version: 5.1
Severity: Normal Keywords: documentation, automatic
Cc: Eric Hanchrow, Adam Zapletal Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description

I spent a fair bit of time investigating an IntegrityError in my code, and eventually discovered that automatic primary key fields don't work *quite* as I expected. This is not a bug, but is surprising, and thus ought to be pointed out somewhere in the docs.

Here are the details.

I have a model which uses the default automatic primary key:

class Thing(models.Model):
    def __str__(self):
        return f"Thing #{self.pk}"

I have some code which creates instances two different ways: both with, and without, specifying a primary key:

class TheOneTestCase(TestCase):
    def test_whatever(self):
        Thing.objects.create(pk=2)

        Thing.objects.create()
        Thing.objects.create()

        self.assertEqual(Thing.objects.count(), 3)

When I run this code with sqlite as the database, it passes, and creates instances with primary key values of 2, 3, and 4.

However, when I run this code with postgresql as the database, the third (i.e., the last) "create" call raises an exception:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "app_thing_pkey"

As best I can tell, this is not a bug; it's simply how Postgresql's sequences behave.

Anyway, since it surprised me, it might surprise other developers too, and thus ought to be mentioned somewhere in the docs.

Attachments (1)

0001-Warn-about-surprising-behavior-of-automatic-primary-.patch (1.3 KB ) - added by Eric Hanchrow 106 minutes ago.

Download all attachments as: .zip

Change History (3)

comment:1 by Adam Zapletal, 54 minutes ago

Last edited 54 minutes ago by Adam Zapletal (previous) (diff)

comment:2 by Adam Zapletal, 53 minutes ago

Cc: Adam Zapletal added
Note: See TracTickets for help on using tickets.
Back to Top