没有'拥有'属性的Postgres序列不会在Django 1.3中返回id

时间:2011-06-24 11:00:28

标签: django postgresql

最近从Oracle迁移到Postgres并从Django 1.2升级到1.3后,我们在将对象保存到数据库时开始遇到问题。当调用save()时,不返回id,即使通过标准django管理面板保存标准django auth模型,也会发生这种情况(即使用户已添加到db,也会返回'/ admin / auth / user / None /')并有一个id。。

我们运行相同数据库的所有其他站点都没有这个问题,但它们运行的​​是Django 1.1或1.2。

我们发现,对于迁移后创建的新表,它们的序列有一个'拥有'属性,该属性由序列所在的列(通常是id列)拥有。改变'拥有'属性修复了我们在1.3中遇到的问题。

有人知道这个问题的根源是什么吗?我们已经找到了解决方案,如果其他人有这个问题,但我们很想知道是什么导致了这个问题。

2 个答案:

答案 0 :(得分:6)

在postgresql中,如果你拥有一个对象,你可以有效地做任何你想做的事情。因此,如果您不是所有者,则需要在序列上授予用户“USAGE”。

Postgresql Ownership

Postgresql Grants

答案 1 :(得分:1)

似乎django可能使用pg_get_serial_sequence来获取与表的列相关联的序列,然后使用currval来获取序列的当前值,但如果序列不归表所有,则不是与列关联,因此无法正常工作。

OWNED BY属性将序列与给定的表和列相关联。如果序列的OWNED BY设置为NULL,则它本质上是一个独立的序列,并且不以任何方式与任何表或列真正关联,甚至与主键关联的更少。