37  /  97

Проблема версионности БД

Просмотров: 25302
Дата последнего изменения: 23.09.2021
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
2
3
4
5

При работе нескольких разработчиков на собственных базах данных возникает проблема совмещение изменений от всех разработчиков на едином тестовом сервере.

Вариант решения

Все изменения БД оформляются скриптом php. (Обновления самой системы Bitrix Framework реализованы подобным образом.) В скрипте проверяется текущая версия структуры БД (например, в опции COption). Если версия новая, то выполняется блок кода, модифицирующий БД, и устанавливается новое значение версии в опциях (инкремент). Скрипт коммитится наряду с "обычными" файлами. Каждый модуль подключает этот скрипт (на каждом хите, но клиентам этот вызов не уходит), и когда он приходит из репозитория, выполняются запросы и версии структуры БД выравниваются.

Скриптов может быть несколько, например, для каждого модуля отдельный. На проекте, также, могут быть разные области и удобнее будет несколькими скриптами вносить изменения. Примерный вид скрипта миграции:

$current_version = intval(COption::GetOptionInt("main", "~database_schema_version", 0));

 if ($current_version < 5) // 11.5.7
{
   if (!$DB->Query("select TIME_ZONE_OFFSET from b_user WHERE 1=0", true))
   {
      $updater->Query(array(
         "MySQL"  => "ALTER TABLE b_user ADD TIME_ZONE_OFFSET int(18) null",
         "Oracle" => "ALTER TABLE b_user ADD TIME_ZONE_OFFSET number(18) NULL",
         "MSSQL"  => "ALTER TABLE b_user ADD TIME_ZONE_OFFSET int NULL",
      ));
   }
   COption::SetOptionString("main", "~database_schema_version", 5);
}
if ($current_version < 6) // 11.5.7
{
   if (!$DB->IndexExists("b_event_message", array("EVENT_NAME")))
   {
      $updater->Query(array(
         "MySQL"  => "CREATE INDEX ix_b_event_message_name ON b_event_message (EVENT_NAME(50))",
         "Oracle" => "CREATE INDEX ix_b_event_message_name ON b_event_message (EVENT_NAME)",
         "MSSQL"  => "CREATE INDEX IX_B_EVENT_MESSAGE_NAME ON B_EVENT_MESSAGE (EVENT_NAME)",
      ));
   }

   COption::SetOptionString("main", "~database_schema_version", 6);

}

Примечание: Каждый из разработчиков команды собирает скрипт самостоятельно, включая в него необходимые проверки и т.д.

Возможна несколько иная реализация. Например, не подключать скрипт на каждом хите, а сделать хук в системе контроля версий на пулл.

Примечание: В любом случае, независимо от масштабности проекта и способа реализации, необходимо документирование на каждом этапе и универсальность кода.

Например создали таблицу в БД - опишите ее в Wiki, чтобы каждый программист при написании классов, обращающихся к БД знал имя таблицы, имена и параметры полей.

Примечание: В Маркетплейсе есть решение Миграции для разработчиков, облегчающее решение проблемы версионности.

Решение не является разработкой компании 1С-Битрикс, все вопросы по его работе обращайте к разработчику.

5
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии