Перенос данных из старой базы данных в новую
В настоящее время я создаю новую версию веб-приложения, и у меня есть существующая база данных. Теперь я хочу иметь новую базу данных для новой версии, поскольку существующая база данных не совсем оптимальна. Я не могу изменить старую базу данных, так как она все еще используется в производстве.
Могу ли я каким-то образом создать новую таблицу базы данных и заполнить ее измененными версиями данных из старой?
Например, представим, что у меня есть старая модель:
class UserNumbers(model.Model):
id=models.IntegerField(primary_key=True)
name=models.CharField(max_length=50, blank=True, null=True)
phone_number1=models.CharField(max_length=50, blank=True, null=True)
phone_number2=models.CharField(max_length=50, blank=True, null=True)
phone_number3=models.CharField(max_length=50, blank=True, null=True)
и хочу заполнить мою новую модель:
from phone_field import PhoneField
class User(model.Model):
id=models.IntegerField(primary_key=True)
name=models.CharField(max_length=50, blank=True, null=True)
class UserNumbers(model.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
phone_number = PhoneField(help_text='Contact phone number')
comment = models.CharField()
Итак, есть ли какой-нибудь способ, например:
for data in UserNumbers_old:
User_new(id=data.id,name=data.name).save()
if data.phone_number1:
UserNumbers_new(user_id=data.id,phone_number=data.phone_number1,comment="")
...
Да, вы можете это сделать. Но если у вас действительно производственная система, то безопаснее всего будет:
- Создайте новую базу данных , а не просто новую таблицу. Скопируйте все таблицы (резервное копирование из старой базы данных, загрузка в новую; точная процедура будет отличаться для MySQL и PostgreSQL, и т.д.) из старой базы данных в новую базу данных.
- Используйте
- migrations от Django для преобразования структур таблиц с целью оптимизации, добавления новых полей и т.д.. Если прямые миграции не справляются со всем (например, исходя из этого примера, нужно создать 1, 2 или 3 записи UserNumbers для каждого пользователя в зависимости от того, сколько телефонных номеров на самом деле в существующих записях), тогда вы создаете
- миграцию данных для преобразования.
- Резервное копирование (всегда, чтобы быть в безопасности) базы данных
- Запустите все миграции структуры базы данных и данных в одном пакете, а Django позаботится о деталях. Вам не нужно будет помнить, что "миграция" данных должна выполняться между регулярными миграциями 17 и 18, потому что на самом деле это будет # 18, а следующая регулярная миграция будет 19 и т.д. .
- Миграция не будет зависеть от наличия двух разных баз данных. Вместо этого все (будь то в разработке (сейчас) или в производстве (позже)) будет одной и единственной базой данных, насколько это касается Django.
Миграция данных может делать все, что может делать обычная программа на Python. Но ее преимущество в том, что однажды, когда вы захотите обновить производственную систему, вы сможете: