Хорошо, так вот ситуация: вы работаете в команде, и каждый разработчик работает с местной средой. Или у вас есть несколько сред. Или… Нам все равно. Единственное, что вы должны обрабатывать разные версии баз данных, и вы не знаете, как это сделать безопасно и эффективно.
Разные версии базы данных могут отличаться с точки зрения данные или с точки зрения состав . В этой статье мы сосредоточимся на управлении различными версиями базы данных с различными структурами, используя словарный запас реляционного базы данных с MySQL
Примеры. Тем не менее, это решение может работать для любой базы данных, например, noSQL.
Потенциальное решение
Здесь мы предполагаем, что вы работаете в команде, и у вас есть инструмент, чтобы поделиться кодом между людьми (например, Git, SVN).
Давайте создадим скрипт в проекте, где вы положите всю эволюцию базы данных. Это может быть сценарий SQL, код в любом языке программирования, который вы подключаетесь к базе данных или другое решение. Это не важно, единственное, что вы можете выполнить запросы в базе данных. Когда разработчик хочет изменить структуру базы данных, он напишет блок кода (один или несколько запросов) в конце этого файла и поделитесь файлом с другими людьми. Важно сохранить этот файл в курсе и регулярно проводить его на всю среду.
На данный момент, если вы выполните файл несколько раз, вы, безусловно, столкнулись с некоторыми ошибками. Это проблематично, потому что вам нужно запустить этот файл каждый раз, когда он обновляется. Таким образом, вы должны добавить условие на каждом блоке и хранить в базе данных, какой блок уже выполнен. Для этого, YO может создать таблицу в вашей базе данных, чтобы сохранить каждую эволюцию с уникальным идентификатором. Наконец, вы запустите блок только в том случае, если идентификатор еще не хранится на этой таблице.
Это все. В следующем примере обеспечивается иллюстрация процесса.
Пример
Этот пример основан на проекте разработки, который использует базу данных MySQL для хранения некоторых данных приложений. Есть два разработчика, которые развиваются в локальной среде на своем ноутбуке (SO 2 в средах развития), и есть одна производственная среда. Для каждой среды есть одна база данных. Базы данных уже существуют, но мы хотим быть уверены, что у нас есть ту же версия (та же структура) базы данных на каждой среде.
Как правило, в проекте база данных развивается с кодом проекта. Поэтому, если вы обновите базу данных, вы должны обновить код и наоборот.
Во-первых, давайте создадим таблицу для хранения эволюции. Мы должны выполнить этот запрос на все базы данных:
CREATE TABLE db_evol( id_evol VARCHAR(10) PRIMARY KEY NOT NULL );
Теперь давайте создадим файл db_evol.sql
В проекте, с нашей первой эволюцией. Здесь мы используем процедуру MySQL, но мы могли бы использовать других.
delimiter // -- evol1 create procedure evol() begin set @id_evol := "evol1"; SET @count:= (select COUNT(*) FROM db_evol WHERE id_evol= @id_evol); if @count = 0 then -- This 2 lines correspond to the DB evolution ALTER TABLE table1 ADD new_col VARCHAR(255); UPDATE table1 set new_col = 'default value'; INSERT INTO db_evol(id_evol) VALUES(@id_evol); SELECT CONCAT(@id_evol, " executed"); else SELECT CONCAT(@id_evol, " skipped"); end if; end// call evol()// drop procedure evol//
Следующий шаг — второй разработчик, который хочет обновить базу данных. Во-первых, я проверю, если файл db_evol.sql
до даты. Если есть изменения, я запускаю файл. После этого я напишу вторую эволюцию в конце файла и проверить сценарий. Если все в порядке, я буду обновлять файл проекта.
После нескольких эволюций все разработчики соглашаются обновить производственную среду. Таким образом, они будут обновлять код и запустить скрипт db_evol.sql
на производство.
Заключение
В этой статье представлен обзор, как обрабатывать версии базы данных в нескольких средах. Как мы видели, существует не только одно решение: вы столкнетесь с разными случаями. Чтобы вернуться к начальному состоянию в случае ошибок, мы рекомендуем добавить транзакцию или обработку ошибок в вашем скрипте.
Оригинал: «https://dev.to/4sushi/how-to-handle-database-versions-on-multiple-environments-f93»