#15682 closed Bug (duplicate)
Postgresql last_insert_id() failing when using custom schemas
Reported by: | Anssi Kääriäinen | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.3 |
Severity: | Normal | Keywords: | regression |
Cc: | inactivist@… | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Define a table like this:
create sequence foobar; CREATE TABLE test ( id integer not null primary key default nextval('foobar') );
And a model like this:
class TestM(models.Model): pass class Meta: db_table = 'test'
In the shell, try this:
>>> t = TestM() >>> t.save() >>> t.id is None True
The error here is that postgresql's last_insert_id is defined like this:
def last_insert_id(self, cursor, table_name, pk_name): # Use pg_get_serial_sequence to get the underlying sequence name # from the table name and column name (available since PostgreSQL 8) cursor.execute("SELECT CURRVAL(pg_get_serial_sequence('%s','%s'))" % ( self.quote_name(table_name), pk_name)) return cursor.fetchone()[0]
Now, what happens here is that pg_get_serial_sequence('test', 'id') will return NULL, and so will currval(NULL).
This is backwards incompatible as the same code would have worked in 1.2. Though I don't think it is documented anywhere that the above should work.
One possible fix is to throw an error if None is returned by cursor.fetchone()[0] above and also document in the release notes that if you have a database defined like this, you should issue a query:
ALTER SEQUENCE foobar OWNED BY test, id;
This will unfortunately not work if the sequence is used by multiple tables, as a sequence can only be owned by one column at a time.
The best fix would be to allow setting the sequence name as an Meta option in the table (as in #13295), but it is way too late for 1.3.
Change History (7)
comment:1 by , 14 years ago
comment:2 by , 14 years ago
Keywords: | regression added; sequence postgresql removed |
---|
comment:3 by , 14 years ago
Type: | → Bug |
---|
comment:4 by , 14 years ago
Severity: | → Normal |
---|
comment:5 by , 14 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Yeah, this is a duplicate of ##13295 - the fix is to allow a custom sequence declaration.
comment:7 by , 13 years ago
Cc: | added |
---|---|
Easy pickings: | unset |
UI/UX: | unset |
A correction:
ALTER SEQUENCE foobar OWNED BY test, id;
Should be:
ALTER SEQUENCE foobar OWNED BY test.id;