我遇到了可怕的表问题,因为我创建了自己的用户类而不是切换到默认的Django类。在无数令人头疼之后,我们决定干净python manage.py reset
syncdb
。创建了一个新用户,但User.id的主键计数器从前一个用户开始,这意味着在创建使用User.id作为主键的其他表时,它们总是处于关闭状态。
如何完全重写以便从1开始,或者更改计数器,使其现在为2(因为我创建了一个用户)?如果它涉及SQL,请告诉我在哪里放置它,因为我的应用程序托管在Heroku上。
谢谢!
答案 0 :(得分:6)
默认情况下,Postgres会为类型serial
创建的所有列创建新序列。 django auth用户的默认名称为auth_user
,因此默认序列名称为auth_user_id_seq
或类似名称。
您可以通过
找到下一个序列值SELECT nextval('auth_user_id_seq');
您可以通过以下方式将其设置为1:
SELECT setval('auth_user_id_seq', 1);
答案 1 :(得分:1)
解决此问题的最简单方法(不删除整个数据库)是使用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
答案 2 :(得分:0)
要重置所有内容,请删除数据库,重新创建它并运行syncdb以重新创建表。
要仅重置增量计数器,此问题应该有用:How to reset postgres' primary key sequence when it falls out of sync?
您所说的“在创建使用User.id作为主键的其他表时,它们总是关闭14个”。令人担忧您不是依赖每个表上的自动递增主键来表示关系,是吗?