Django model.delete () повторно заполнил первичный ключ - PullRequest
1 голос
/ 10 марта 2020

Занят разработкой своего приложения Django, и у меня есть тестовые данные, которые я хотел бы удалить из некоторых своих таблиц.

Как я могу удалить записи и "сбросить" первичные ключи, чтобы при следующей вставке элемента он имел id=1?

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

Согласно небольшому исследованию, это стандартно для баз данных, и мне нужно обрезать таблицу.

Некоторые предложения - Обрезать таблицу с необработанным кодом SQL:

import sqlite3
conn = sqlite3.connect('db.sqlite3')
cur = conn.cursor()
cur.execute("TRUNCATE TABLE 'table'")

, который, кажется, не работает и выдает следующую ошибку:

OperationalError: near "Truncate": syntax error

Другие предложения - закомментировать модель и повторить migrate. Это также не вариант, так как в таблицах есть несколько зависимых внешних ключей.

Нет ли способа сбросить первичный ключ таблицы?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

(слишком долго для комментария)

  1. Суррогатные ключи не должны рассматриваться как плотный, постоянно растущий перечислитель - это просто ключ, суррогатный, а не реальный ключ для построения базы данных
  2. dev db, test db, prod db должны быть разделены

  3. остерегайтесь демонстрации суррогатного ключа в том виде, как он есть: invoices/3/ после выполнения заказа явно говоря, насколько популярна компания на самом деле.

Когда вы не тестируете на prod, не показывайте идентификаторы пользователям, когда ваш код не основывается на предположении, что идентификаторы начинаются с 1 и каждый следующий идентификатор = предыдущий идентификатор + 1, Вы перестаете думать о том, насколько чисты и красивы реальные значения идентификаторов. Для целей разработки / тестирования - делай что хочешь, даже (как я уже сказал) отбрось всю БД. Если это новый проект и вы готовите БД для перехода на prod - вы можете предпочесть запускать команды sql напрямую, поскольку это одноразовое задание.

При запуске тестов Django по умолчанию создает и бросает новый дб.

Для облегчения подготовки к тестированию есть функция приспособлений .

1 голос
/ 10 марта 2020

Это не связано с django, или, по крайней мере, не напрямую. Вам необходимо сбросить значение последовательности, которая генерирует первичный ключ, см. https://www.sqlite.org/autoinc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...