Django - делаем дамп базы данных и восстанавливаем из него с dumpdata и loaddata
Сколько лет пишу на django, и только недавно внезапно обнаружил, что у неё оказывается есть встроенные стредства для дампа и последующего восстановления схемы базы данных. Это бывает довольно полезно, когда надо по быстрому кому-то передать дамп с тестовыми данными чтобы воспроизвести проблему, или просто передать фикстуры.
Экспорт (дамп) с dumpdata
dumpdata
- это встроенная команда django, с помощью которой можно сделать бэкап (экспорт) текущих моделей базы данных или всей базы данных.
Синтаксис крайне простой. Следующая команда сделает дамп всей базы данных (всех приложений):
./manage.py dumpdata > db.json
После этого в директории с проектом появится файл содержащий описание моделей и сами модели в json формате.
Так же можно сделать дамп моделей определенного приложения:
./manage.py dumpdata admin > admin.json
И дамп определенной таблицы:
./manage.py dumpdata admin.logentry > admin_logentry.json
Команда выше экспортирует таблицу admin.logentry
.
Так же есть возможность исключить таблицы . Следующая команда экспортирует всю базу данных кроме таблицы auth.permission
:
./manage.py dumpdata --exclude auth.permission > db.json
По-умолчанию данные экспортируются в одну строку, без какого либо форматирования. Это не очень удобно для чтения человеком, поэтому можно указать отстуступы с помощью ключа --indent
. Следующая команда экспортирует таблицу auth.user
в более удобном для восприятия человека виде:
./manage.py dumpdata auth.user --indent 2 > db.json
В результате выполнения этой команды создастся файл db.json
с примерно таким содержимым:
С помощью опции --format
можно указать другой формат для экспортируемого файла.
Доступны следующие форматы:
- xml
- yaml (требуется дополнительно установить модуль yaml)
- json
Например, если следующая команда:
./manage.py dumpdata auth.user --indent 2 --format yaml > db.json
Экспортирует таблицу auth.user
в файл с формате yaml
:
Импорт (восстановление) с loaddata
Команда loaddata
позволяет загрузить фикстуры (экспортированные с помощью dumpdata
данные). Синтаксис так же крайне прост:
./manage.py loaddata db.json
Восстановление всей базы данных
Если вы попробуете сделать экспортировать данные на одном ПК, и восстановить на другом, то у вас ничего не выйдет. В процессе будет "выброшено" исключение IntegrityError
. При этом на том же ПК, на котором был сделан экспорт - все будет импортироваться прекрасно. Чтобы избежать этой проблемы, из экспорта необходимо исключить таблицы contenttypes
и auth.permissions
:
./manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json
После этого импорт должен пройти без проблем:
./manage.py loaddata db.json