Модуль Битрикс: создание и удаление таблиц при установке (InstallDB / UnInstallDB)
Выполнение install.sql и uninstall.sql через CDatabase::RunSQLBatch при установке и удалении модуля. По документации 1С-Битрикс, с проверкой ошибок и путём от корня модуля.
Как использовать
- Положите install.sql и uninstall.sql в install/db/ модуля.
- Добавьте методы InstallDB() и UnInstallDB() в класс модуля (CModule).
- Вызовите InstallDB() в DoInstall() до registerModule(); UnInstallDB() в DoUninstall() после UnInstallFiles(), до unRegisterModule().
- Используйте CREATE TABLE IF NOT EXISTS и DROP TABLE IF EXISTS для идемпотентности.
Закрывает боль: при установке/удалении модуля нужно создавать и удалять свои таблицы через штатный API, без ручного SQL в консоли. По документации Битрикс SQL выполняют через $DB->RunSQLBatch() (путь к .sql-файлу); ошибки нельзя игнорировать.
Структура файлов в модуле:
/local/modules/vendor.simplemodule/
└── install/
└── db/
├── install.sql
└── uninstall.sql
install/db/install.sql:
CREATE TABLE IF NOT EXISTS vendor_simple_date (
ID INT NOT NULL AUTO_INCREMENT,
CREATED_AT DATETIME NOT NULL,
PRIMARY KEY (ID)
);
install/db/uninstall.sql:
DROP TABLE IF EXISTS vendor_simple_date;
Методы в классе модуля (CModule):
public function InstallDB()
{
global $DB;
$sqlPath = $_SERVER['DOCUMENT_ROOT'] . '/local/modules/' . $this->MODULE_ID . '/install/db/install.sql';
if (file_exists($sqlPath)) {
$errors = $DB->RunSQLBatch($sqlPath);
if (is_array($errors) && !empty($errors)) {
throw new \Bitrix\Main\SystemException(implode("\n", $errors));
}
}
return true;
}
public function UnInstallDB()
{
global $DB;
$sqlPath = $_SERVER['DOCUMENT_ROOT'] . '/local/modules/' . $this->MODULE_ID . '/install/db/uninstall.sql';
if (file_exists($sqlPath)) {
$errors = $DB->RunSQLBatch($sqlPath);
if (is_array($errors) && !empty($errors)) {
throw new \Bitrix\Main\SystemException(implode("\n", $errors));
}
}
return true;
}
Подключение в DoInstall() / DoUninstall():
public function DoInstall()
{
global $APPLICATION;
$this->InstallDB();
$this->InstallFiles();
\Bitrix\Main\ModuleManager::registerModule($this->MODULE_ID);
$APPLICATION->IncludeAdminFile('Установка модуля', __DIR__ . '/install/step.php');
}
public function DoUninstall()
{
global $APPLICATION;
$this->UnInstallFiles();
$this->UnInstallDB();
\Bitrix\Main\ModuleManager::unRegisterModule($this->MODULE_ID);
$APPLICATION->IncludeAdminFile('Удаление модуля', __DIR__ . '/install/unstep.php');
}
Важно: SQL выполняем до регистрации при установке и после снятия регистрации при удалении (или в обратном порядке по вашей политике — главное симметрия). RunSQLBatch() принимает путь к файлу; возвращает массив ошибок или пустой массив/не массив при успехе — всегда проверяйте результат.