SQL для изменения структуры модели

У меня уже есть такая модель:

class MyBase(models.Model): field_a = models.IngetField() field_b = models.IngetField()
class Class1(MyBase): field_c = models.IngetField()
class Class2(MyBase): field_c = models.IngetField()

Это означает и автоинкремент mybase_ptr_id и поле field_c для каждого Class1 и Class2.

Из-за соображений дизайна мы хотим изменить схему на:

class Class1(models.Model): field_a = models.IngetField() field_b = models.IngetField() field_c = models.IngetField()
class Class2(models.Model): field_a = models.IngetField() field_b = models.IngetField() field_c = models.IngetField()

Для этого вместо этого потребуется идентификатор автоинкремента и поля field_a, field_b, field_c (наиболее распространенный aproach, я думаю).

Существует ли установленный или рекомендуемый способ изменения структуры таблиц? Я использую postgresql.

Я полагаю, что основной способ для каждой таблицы:

  1. Создайте новый столбец идентификаторов.
  2. Заполните ту же информацию, что у меня уже есть на mybase_ptr_id.
  3. Преобразуйте идентификатор в последовательный NOT NULL PRIMARY KEY.
  4. Reindex id следующее значение.
  5. Добавьте поля field_a и field_b.
  6. Соответствует значениям полей field_a, field_b из таблицы MyBase.
  7. Отбросить столбец из mybase_ptr_id.

Не хватает ли мне каких-либо важных проблем? Я хотел бы прочитать ваши рекомендации...

1 ответ

Как правило, я бы рекомендовал использовать Юг для изменения моделей баз данных, он может обрабатывать несколько вещей автоматически для вас.

Но изменение чего-то столь же резкого, как это при сохранении данных, потребует небольшой ручной работы.

Я думаю, что у вас есть схема, в основном там, хотя я не думаю, что вам нужно конвертировать в сериал позже. Я думаю, вы можете создать столбец id с самого начала. Просто добавьте индекс первичного ключа после копирования данных.

Итак... мой совет:

  1. Добавьте серийный id, field_a и field_b с полями field_a и field_b как пустые поля.
  2. update table set id = mybase_ptr_id, field_a = other_table.field_a,...
  3. обновите свою последовательность, чтобы начать с select max(id) from table
  4. make id - первичный ключ, а остальные поля не равны нулю
  5. drop mybase_ptr_id

licensed under cc by-sa 3.0 with attribution.