Разработчикам · 2 МИН ЧТЕНИЯ

Запросы, транзакции и миграции

Работайте с данными через QueryBuilder и оформляйте изменения схемы миграциями.

Перед началом

Используйте отдельную базу для разработки и проверяйте схему текущей установки. Данные пользователя не должны становиться частью SQL-строки.

Порядок действий

  1. Получите QueryBuilder через App::query() или доступный сервис action. Передавайте значения через параметры методов.
  2. Пропускайте динамические имена таблиц, колонок и направления сортировки через whitelist. SQL-выражения используйте только в явных Raw-методах.
  3. Перед update обязательно задайте условие. Для намеренного обновления всей таблицы используйте явный updateAll().
  4. Связанные изменения нескольких таблиц объединяйте транзакцией. Для инфоблоков используйте IblockService, чтобы сохранить поля, категории и lifecycle.
  5. Изменения схемы оформляйте миграцией с read-only preflight и синхронизируйте установочную схему. Конфликт должен блокировать batch до первого DDL.
  6. Проверьте повторный запуск миграции, компенсацию неудачной попытки и работу с native prepared statements.
Обратите внимание. Автоматическая компенсация использует rollbackFailedUp(), а не обычный down. Она не должна удалять объекты, существовавшие до неудачного запуска.

Проверьте результат

Пользовательские значения параметризованы, связанные записи согласованы, миграция повторяется безопасно и не теряет существующую схему.

Скриншот инструкции