Django + PostgreSQL:如何重置主键?

TM.*_*TM. 25 database django postgresql primary-key

我一直在研究Django中的应用程序.首先,为简单起见,我一直在使用sqlite3作为数据库.

但是,一旦我转移到PostgreSQL,我遇到了一个问题:一旦我清除了表,主键就不会重置.

这个应用程序是一个长时间(几周)播放的游戏.因此,每次新游戏开始时,所有数据都将从数据库中清除,然后添加新的随机数据.

我希望能够在1每次清理/重建游戏时从主键开始"重新开始" .

代码仍然按原样运行,但整数是描述游戏中对象的一种非常自然的方式.我想让每场新游戏从1开始,而不是在最后一场比赛停止的地方.

如何在PostgreSQL中重置主键计数器?请记住,我不需要保存表格中的数据,因为无论如何我都要擦除它.

Van*_*ale 29

在你的app目录中试试这个:

python manage.py help sqlsequencereset
Run Code Online (Sandbox Code Playgroud)

像这样将它传输到psql中以实际运行重置:

python manage.py sqlsequencereset myapp1 myapp2 | psql
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的一个表上此命令的输出示例:

BEGIN;
SELECT setval('"project_row_id_seq"', coalesce(max("id"), 1), max("id") IS NOT null) FROM "project_row";
COMMIT;
Run Code Online (Sandbox Code Playgroud)


Pao*_*rre 6

如“ Van Gale”所建议,您可以获取命令来解决运行中的问题sqlsequencereset

要么

您可以通过sqlsequencereset以下方式执行python内部生成的SQL查询(使用默认数据库):

from django.core.management.color import no_style
from django.db import connection

from myapps.models import MyModel1, MyModel2


sequence_sql = connection.ops.sequence_reset_sql(no_style(), [MyModel1, MyModel2])
with connection.cursor() as cursor:
    for sql in sequence_sql:
        cursor.execute(sql)
Run Code Online (Sandbox Code Playgroud)

我使用Python3.6Django 2.0PostgreSQL 10测试了此代码。


Lau*_*ira 5

如果您执行原始 sql,可以这样做:

ALTER SEQUENCE youApp_id_seq RESTART WITH 1;
Run Code Online (Sandbox Code Playgroud)

文档:http : //www.postgresql.org/docs/8.2/static/sql-altersequence.html