[Миграции баз данных SQLite] Оцените, пожалуйста, сложность задачи

nikola1956

Раньше, к сожалению, никогда не сталкивался с задачей о миграциях баз данных. Поделитесь, пожалуйста, опытом, насколько сложная эта задача? Легко ли писать sql-скрипты для произвольных изменений в базе данных, которые должны происходить без потери данных? Имею в виду переименование таблиц, полей, удаление полей, изменение связей между таблицами и т.п.
Или все это настолько сложно и неудобно, что категорически рекомендуется предварительно сохранить данные в облаке (на каком-то сервере а потом их заново загрузить в пересозданную базу данных?

6yrop

Зависит насколько схема старой БД отличает от схемы новой БД.
Если различия небольшие, то можно частично сделать ddl скриптами, частично dml.
Если различия больше, то проще перепилить старую в новую.
Естественно, еще важен размер базы, и сколько времени отводится на выполнение миграции. Если там терабайты, и простой должен быть в несколько минут, то всё гораздо интереснее.
Специфики SQLite не знаю.

nikola1956

Спасибо за ответ!
База данных небольшая, объемом около 50 Мб, таблиц, не являющихся связями, около 20-ти
А что означает выражение "перепилить старую [базу данных] в новую"? Данные ведь нужно где-то сохранить.

6yrop

База на мобильных устройствах?

nikola1956

Да, база данных мобильного приложения.
Посмотрел, в SQLite даже нельзя переименовать или удалить поле в таблице напрямую (http://www.sqlite.org/lang_altertable.html) :(

tokuchu

Посмотрел, в SQLite даже нельзя переименовать или удалить поле в таблице напрямую (http://www.sqlite.org/lang_altertable.html) :(
Создай новую таблицу селектом из старой.

nikola1956

Да, так можно, но сложность значительно выше. Пример из интернета:
Была таблица: CREATE TABLE team(Name TEXT, Coach TEXT, City TEXT);
Переименование поля City --> Location:
(1) ALTER TABLE team RENAME TO team_orig;
(2) CREATE TABLE team(Name TEXT, Coach TEXT, Location TEXT);
(3) INSERT INTO team(Name, Coach, Location) SELECT Name, Coach, City FROM team_orig;
(4) DROP TABLE team_orig;

0000

Если используются констрейнты и FK, то будет несколько веселее.
Пока задача про сферического коня.
Тот же sqlite на время переноса можно значительно ускорить, если отказаться от потверждения записи на диск.

YUAL

Да, так можно, но сложность значительно выше.
В чём сложность то? Больше строк написать? Для однократной миграции не велика разница 1 или 4 строки написать. Если ты там каждый день мигрируешь, то ты что-то делаешь не так напиши обёртку, которая будет алтер тэйбл превращать в этот набор команд. Ресурсов сильно больше тратится? Ну так при крошечной базе и одиночных миграциях это не критично ни разу.

PooH

База данных небольшая, объемом около 50 Мб, таблиц, не являющихся связями, около 20-ти
это типа теперь называется миграция бд?
Оставить комментарий
Имя или ник:
Комментарий: