Как обезопасить данные при изменение архитектуры базы данные?
К примеру была таблица news с полями: id, alias, title, description. После чего я решил установить мультиязычность и установил django-parler. Запустил миграцию таблица news поля стали: id, alias и создалась новая таблица news_translation с полями: id, language_code, title, description, master_id.
Вообщем все те данные которые были в news были исчезнуты после миграции.
Если по уму, то следует сначала выполнить миграцию, которая создаёт дополнительную таблицу, потом создать и выполнить миграцию данных, а потом выполнить миграцию удаляющую поля из исходной таблицы. Либо выполнить команду dumpdata, выполнить миграцию, а потом накидать простенький скриптик, который набьёт новую таблицу предварительно сохранёнными данными.
Сергей Горностаев: "то следует сначала выполнить миграцию, которая создаёт дополнительную таблицу"
может вам будет болей ясно как тут устроено:
models.py:
from django.db import models
from parler.models import TranslatableModel, TranslatedFields
class check(TranslatableModel):
alias = models.CharField(max_length=100)
status = models.BooleanField()
translations = TranslatedFields(
title=models.CharField(max_length=100),
description=models.TextField(),
)
я не смогу запустить миграцию которая будет создавать только доп.миграцию.
from django.db import models
class check(models.Model):
alias = models.CharField(max_length=100)
status = models.BooleanField()
title = models.CharField(max_length=100)
description = models.TextField()
запускаю makemigrations , migrate ( вернул в начальное состояние ).
и делаю python3.5 manage.py dumpdata
меняю модель :
from django.db import models
from parler.models import TranslatableModel, TranslatedFields
class check(TranslatableModel):
alias = models.CharField(max_length=100)
status = models.BooleanField()
translations = TranslatedFields(
title=models.CharField(max_length=100),
description=models.TextField(),
)
делаю makemigrations , migrate но данные не перенеслись.
Alexander: dumpdata выводит данные модели в формате json. Надо их сохранить в файл. Потом запустить миграцияю. А после миграции написать скрипт, который будет json разбирать и запихивать данные обратно в базу.
Сергей Горностаев:
Спасибо , более менее разобрался:
python3.5 manage.py dumpdata check1 >db.json
создался файл с данными. Теперь хочу понять где именно я должен писать скрипт для этого ? migrations/__init__.py там ?
Alexander: я обычно запускаю python manage.py shell и пишу сразу в нём. Можно создать какой-нибудь load.py в корне проекта, накодить в него и импортировать его в сеансе shell'а.
import json
from .check1.models import *
class load():
json_data = open('db.json')
dates = json.load(json_data)
for date in dates:
print(date['pk'])
ss = check(title=date['pk'], master_id=date['pk'])
ss.save()
json_data.close()
запускаю mange.py shell затем внутри import load после чего ошибка :
File "<console>", line 1, in <module>
File "/home/alexander/my_projects/testing/testing/load.py", line 3, in <module>
from .check1.models import *
SystemError: Parent module '' not loaded, cannot perform relative import
import json
from check1.models import check
class load():
json_data = open('db.json')
dates = json.load(json_data)
for date in dates:
ss = check(title=date['title'], status=1)
ss.save()
json_data.close()
Ошибка :
File "/home/alexander/my_projects/testing/env/lib/python3.5/site-packages/django/db/models/base.py", line 700, in save
force_update=force_update, update_fields=update_fields)
File "/home/alexander/my_projects/testing/env/lib/python3.5/site-packages/parler/models.py", line 855, in save_base
assert self.language_code is not None, ""\
AssertionError: No language is set or detected for this TranslatableModelMixin.
Is the translations system initialized?