#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 , 15 years ago
comment:2 by , 15 years ago
| Keywords: | regression added; sequence postgresql removed |
|---|
comment:3 by , 15 years ago
| Type: | → Bug |
|---|
comment:4 by , 15 years ago
| Severity: | → Normal |
|---|
comment:5 by , 15 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 , 14 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;