【问题标题】:Postgres sequences without an 'owned by' attribute do not return an id in Django 1.3没有“拥有者”属性的 Postgres 序列在 Django 1.3 中不返回 id
【发布时间】:2011-09-21 22:47:51
【问题描述】:

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

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

我们发现,对于迁移后创建的新表,它们的序列具有“拥有者”属性,该属性由序列所在的列(通常是 id 列)拥有。更改“拥有者”属性解决了我们在 1.3 中遇到的问题。

有人知道造成这种情况的根本原因是什么吗?如果其他人遇到此问题,我们已经找到了解决方案,但我们很想知道是什么原因造成的。

【问题讨论】:

  • 我遇到了同样的问题。你介意分享你的解决方案吗?将不胜感激。
  • @iain-shelvington 你是怎么解决这个问题的?
  • @Neil 我们所有的表都有一个主键“id”,我们为所有表运行这个 SQL。 ALTER SEQUENCE tablename_id_seq OWNED BY tablename.id;
  • @IainShelvington 谢谢。这对我也有用。

标签: django postgresql


【解决方案1】:

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

Postgresql Ownership

Postgresql Grants

【讨论】:

    【解决方案2】:

    似乎django可能使用pg_get_serial_sequence获取与表列关联的序列,然后currval获取序列的当前值,但如果序列不属于表,则它不与列关联,所以它不起作用。

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

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 2013-05-10
      • 1970-01-01
      • 2012-09-10
      • 2012-12-30
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多