Django + PostgreSQL: как сбросить первичный ключ? - PullRequest
25 голосов
/ 13 февраля 2009

Я работал над приложением в Django. Начнем с того, что для простоты я использовал sqlite3 для базы данных.

Однако, как только я перешел на PostgreSQL, у меня возникла небольшая проблема: первичный ключ не сбрасывается после очистки таблицы.

Это приложение представляет собой игру, в которую играют в течение длительного периода времени (недели). Таким образом, каждый раз, когда начинается новая игра, все данные удаляются из базы данных, а затем добавляются новые рандомизированные данные.

Я бы хотел иметь возможность "начинать заново" с первичных ключей, начинающихся с 1 каждый раз, когда я очищаю / перестраиваю игру.

Код все еще работает как есть, но целые числа - довольно естественный способ описания объектов в моей игре. Я бы хотел, чтобы каждая новая игра начиналась с 1, а не с того места, где остановилась последняя игра.

Как мне сбросить счетчик первичного ключа в PostgreSQL? Имейте в виду, что мне не нужно сохранять данные в таблице, так как я все равно их стираю.

Ответы [ 5 ]

29 голосов
/ 13 февраля 2009

В каталоге вашего приложения попробуйте это:

python manage.py help sqlsequencereset

Передайте это в psql, чтобы запустить сброс:

python manage.py sqlsequencereset myapp1 myapp2 | psql

Редактировать: вот пример вывода этой команды на одну из моих таблиц:

BEGIN;
SELECT setval('"project_row_id_seq"', coalesce(max("id"), 1), max("id") IS NOT null) FROM "project_row";
COMMIT;
4 голосов
/ 10 мая 2018

По предложению "Van Gale" вы можете получить команды для решения вашей проблемы, запустив sqlsequencereset.

или

Вы можете выполнить SQL-запрос, сгенерированный sqlsequencereset из Python, следующим образом (, используя базу данных по умолчанию ):

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)

Я тестировал этот код с Python3.6 , Django 2.0 и PostgreSQL 10 .

4 голосов
/ 20 декабря 2011

Если вы выполняете сырой sql, можете сделать это:

ALTER SEQUENCE youApp_id_seq RESTART WITH 1;

документы: http://www.postgresql.org/docs/8.2/static/sql-altersequence.html

1 голос
/ 14 февраля 2009

Я рассматриваю первичные ключи с автоинкрементом как чисто внутренние идентификаторы для записей базы данных, и мне не нравится показывать их пользователям. Конечно, это обычный дизайн - использовать их как часть URL-адресов, но даже там слагы или другие идентификаторы чувствуют себя более подходящими.

0 голосов
/ 13 февраля 2009

Вам нужно обрезать таблицу. Смотри http://www.postgresql.org/docs/8.1/static/sql-truncate.html

...