У меня странная проблема. Мы пытались создать базовый уровень базы данных для нашей локальной среды, в который были добавлены очень специфические данные. Мы надеялись, что все будут работать с одними и теми же данными, упрощая совместную работу и проверку кода.
Моя идея для этого состояла в том, чтобы запустить команду для сброса базы данных всякий раз, когда мы запускаем миграцию или решаем, что для локальной разработки необходим новый аккаунт. Проблема в том, что дамп базы данных составляет около 17 МБ. Я пытаюсь избежать необходимости добавлять 17-мегабайтный файл в GitHub при каждом обновлении базы данных.
Таким образом, лучшее решение, которое я мог придумать, - это настроить скрипт для выгрузки каждой отдельной таблицы в базу данных. Таким образом, если обновляется отдельная таблица, мы будем отправлять эту резервную копию только на GitHub, и она будет больше в файле ~ 200 КБ, а не в 17 МБ.
Основная проблема, с которой я сталкиваюсь, это попытка восстановить базу данных. С полным дампом обработка внешних ключей является относительно простой, поскольку все это делается одной командой восстановления. Но с многократным восстановлением все становится немного сложнее.
Я ищу способ восстановить все таблицы в базе данных, игнорируя триггеры и ограничения, а затем снова включая их после заполнения данных. (или найдите способ экспортировать таблицы на основе порядка определения внешних ключей). Есть много таблиц, с которыми можно работать, поэтому выполнение этого вручную было бы сложной задачей.
Меня также беспокоит реляционная целостность базы данных, если я отключил / повторно включил ограничения. Любая помощь или совет будут оценены.
Сейчас я запускаю следующее для каждой таблицы:
pg_dump postgres://user:password@pg:5432/database -t table_name -Fc -Z9 -f /data/www/database/data/table_name.bak
А затем эта команда для восстановления всех резервных копий в БД.
$data_command = "pg_restore --disable-triggers -d $dbUrl -Fc \"%s\"";
$backups = glob("$directory*.bak");
foreach($backups as $data_file){
if($data_file != 'data_roles.bak') {
exec(sprintf($data_command, $data_file));
}
}
Это явно не работает, так как я столкнулся с кучей ошибок "Отношения не существует". Я думаю, я просто ищу лучший способ сделать это.