【问题标题】:Reset primary key of Postgres database with Django使用 Django 重置 Postgres 数据库的主键
【发布时间】:2011-12-31 00:26:24
【问题描述】:

我遇到了可怕的表问题,因为我创建了自己的用户类而不是切换到默认的 Django 类。在无数次头痛之后,我们决定只做一个干净的python manage.py resetsyncdb。创建了一个新用户,但是 User.id 的主键计数器从前一个停止的地方开始,这意味着在创建其他使用 User.id 作为主键的表时,它们总是 14 关闭。

如何完全重新擦除以使它们从 1 开始,或者更改计数器使其现在为 2(因为我创建了一个用户)?如果涉及 SQL,也请告诉我放在哪里,因为我的应用托管在 Heroku 上。

谢谢!

【问题讨论】:

    标签: django postgresql primary-key auto-increment


    【解决方案1】:

    要重置所有内容,请删除数据库,重新创建它并运行 syncdb 以重新创建表。

    仅重置增量计数器,这个问题应该会有所帮助:How to reset postgres' primary key sequence when it falls out of sync?

    您所说的“在创建其他使用 User.id 作为主键的表时,它们总是 14 关闭”的部分。令人担忧。您不会依赖每个表上自动递增的主键来建立关系,是吗?

    【讨论】:

    • 默认的 Django 用户模型会自动增加其 id,我将用户作为参数传入,正如它在文档中所说的那样
    • @Chris 我的意思是我不明白为什么如果主键每个都“不同步”会很重要......一个表自动递增的 ID 不应该匹配另一个表的主键。也许我误解了你为什么说从 14 开始的表格是个问题。
    【解决方案2】:

    解决此问题的最简单方法(不删除整个数据库)是使用 psql 或 sql 客户端连接到数据库(例如 http://www.sqlmanager.net/en/products/postgresql/manager,有免费的轻量版)。然后发出以下命令:

    truncate <user_table> reset identity
    

    然后你可以重新填充数据库

    实际上,您实际上也可以通过使用来自 django shell 的原始查询来做到这一点:https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

    【讨论】:

    • 在命令行中运行,它只是说 windows,所以我不确定如何将它放到 heroku 上
    【解决方案3】:

    默认情况下,Postgres 为 serial 类型创建的所有列创建一个新序列。 django auth 用户的默认名称为auth_user,因此默认序列名称为auth_user_id_seq 或类似名称。

    你可以通过

    找到下一个序列值是什么
    SELECT nextval('auth_user_id_seq');
    

    您可以通过以下方式将其设置为 1:

    SELECT setval('auth_user_id_seq', 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2017-06-10
      • 2017-04-02
      • 1970-01-01
      • 2021-10-24
      • 2014-05-28
      • 2021-07-24
      相关资源
      最近更新 更多