Что это было?

Часть читателей, видимо заметила некоторый период непонятного состояния блога. То 500 ISE, то работает, то таймаут, то “under maintenance”, то опять 500 ISE. Другая часть получила кучу спама о новых комментариях.

В общем, дело оказалось довольно безхитростным, но наложившемся на форс-мажор на работе и отсутствием времени дома. До вчера у меня использовался SQLite как самый простой вариант базы данных. Но у этой “СУБД” есть один момент: при записи блокируется вся база целиком. Как следствие, если есть “долгоиграющий” процесс, открывший БД на запись, то все остальные с чтением обламываются.

В общем, вчера перед сном решил быстренько поменять SQLite на MySQL, понадеявшись на manage.py dumpdata/loaddata. Поскольку всё это планировалось “быстренько”, то не удосужился проверить на домашней машине. В итоге, данные не перенёс, лёг поздно, блог отправил в maintenance mode. С утра встал, не выспался, удостоверился, что штатными средствами Django получаю от ворот поворот, начал писать небольшую “вещь” для миграции с SQLite на MySQL. После относительного разгребания груды дел на работе, протестировал на связке SQLite->PostgreSQL и SQLite->MySQL, и, немного “доточив”, положил в песочницу: sandbox/movedb.

Ну и поскольку вы блог читаете, то значит данные я благополучно перенёс.

P.S.А еще эта штука сама разруливает порядок вставки таблиц с внешними ключами ;)

Подписаться Комментировать

Пингбэки

15.10.2009 21:16 VovaZ04h Blog: sqlite to mysql @www.vovaz04h.dp.ua
Перенес данные моего блога с sqlite на mylsq. Очень помог скрипт movedb на у чтение доки по sqlalchemy

Комментарии

28.04.2009 18:05 Юревич Юрий

Кстати, как следствие, я потерял возможность вставлять в посты всякие прикольные юникодные символы, типа стрелочки вместо ->. А всё потому, что у хостера БД в cp1251.

29.04.2009 7:52 Прохожий

В своё время тоже искал решение как бы с sqlite соскочить на «более другую» © базу данных, в итоге dumpdata/loaddata оказалось самым простым и в тоже время самым лучшим решением.

А бд в cp1251 вообще смех, в 21 веке за такое просто меняют хостера.

29.04.2009 15:28 Юревич Юрий

А бд в cp1251 вообще смех, в 21 веке за такое просто меняют хостера.

Да я с MySQL толком не работал, вроде как есть способы поменять кодировку БД. Я о факте “cp1251” узнал только в момент написания поста и как-то не хотелось еще себе в этот день искать приключений.

Как будет время и совсем припрёт стрелкочки вставлять, так поменяю. В остальном оно мне душу не терзает.

29.04.2009 15:35 Юревич Юрий

в итоге dumpdata/loaddata оказалось самым простым и в тоже время самым лучшим решением

Вроде у меня было дело в том, что если делать per-app выгрузку/загрузку, то он дублирует информацию (как миниму теги). Если глобально выгрузку/загрузку с --exclude и удалением части данных после syncdb — то там неправильный порядок загрузки. В итоге, мне показалось проще написать штуку, которая сама будет сортировать таблицы в нужном порядке, чем делать это (сортировку) руками.

Ну плюс еще и воспроизводимо :D Инструмент не привязан ни к Django, ни к структуре бд/приложений Byteflow.

29.04.2009 16:09 Прохожий

Зачем поапово? Что значит «порядок загрузки»?

sqlite2mysql|postgresql|whateverДелается так.

  1. Делается полный дамп: «./manage.py dumpdata > ../initials/fulldump.json» без параметров;
  2. В сеттингсах меняется база;
  3. Делается syncdb;
  4. Таблицы очищаются средствами управления базой;
  5. Делается «./manage.py loaddata ../initials/*».

Изобретение велосипедов это неплохо и наверняка кому-то пригодится, просто вот есть для миграции бд на джанго ещё вот такой способ.

Мне лично сыкотно прямыми способами переносить базы, так как кажется, что что-то да обязательно потеряется, какие-нить хитрые ключи или индексы, ведь базы очень сильно отличаются.

Форма комментирования для «Что это было?»

Обязательное поле. Не больше 30 символов.

Обязательное поле

Пожалуйста, введите символы, которые вы видите на изображении

29.04.2009 16:15 Юревич Юрий

Что значит «порядок загрузки»?

У таблицы A есть внешние ключи на таблицы Б и В. Чтобы нормально загрузить данные, нужно загрузить Б и В, и только затем А. Django при выгрузке/загрузке данных (у меня) данные выгружал в порядке прописывания приложений в INSTALLED_APPS. Вещь же при помощи SQLAlchemy определяет наличие внешних ключей и загружает данные в нужном порядке.

Мне лично сыкотно прямыми способами переносить базы, так как кажется, что что-то да обязательно потеряется, какие-нить хитрые ключи или индексы, ведь базы очень сильно отличаются.

Переносить схему страшно, ага. А данные — нисколько. Так я схему создал в MySQL при помощи manage.py syncdb.

29.04.2009 16:23 Big 40wt Svetlyak

А, теперь понятно. А мой tool пытался и саму схему переносить автоматически. Потому и не все работало.

29.04.2009 16:26 Юревич Юрий

Ну у меня тул пытается схему только не существующих таблиц переносить.

29.04.2009 15:11 Big 40wt Svetlyak

Я тоже писал в свое время простенький скриптик, использующий для миграции SQLAlchemy, но только в обратную сторону — с MySQL на SQLite.

Хотя предполагалось, что и в обратную сторону оно должно работать, но не тут то было, в SQLAlchemy есть какие-то косяки с чтением схемы из SQLite, или что-то в этом роде :(

29.04.2009 15:30 Юревич Юрий

Гм. УМВР. По крайней мере у меня нет проблем с чтением схемы в SQLite, MySQL или PostgreSQL через SQLAlchemy.