Можно ли написать изменение Sqitch, которое удаляет столбец, не обрекая проверку sqitch на вечную ошибку?

Этот вопрос специфичен для Sqitch, но может иметь отношение к другим инструментам управления миграцией баз данных.

Первое изменение Sqitch в моем приложении определяет его общую схему: оно создает все мои таблицы и определяет их столбцы.

Предположим, первое изменение называется appschema, а одна из создаваемых им таблиц — lessons со столбцами chapter, section и title.

Теперь, спустя пару уже развернутых изменений, я хочу удалить столбец title из таблицы lessons.

Я запускаю sqitch add move_lesson_titles_out_of_db и пишу сценарий deploy этого изменения как

ALTER TABLE lessons DROP COLUMN title;

Я sqitch deploy перенес это на свою локальную цель разработки, и все работает, как и ожидалось.

Но теперь sqitch verify dev терпит неудачу, потому что сценарий проверки изменения appschema пытается подтвердить существование столбца title. До сих пор я мог запускать sqitch verify dev, и все предыдущие изменения сохранялись. Возможно, это мое неправильное понимание, но у меня сложилось впечатление, что все изменения должны продолжать проверяться при запуске по порядку на правильно развернутой и обновленной цели Sqitch.

Я мог бы sqitch rework appschema вместо того, чтобы добавлять изменение, но документация по Sqitch очень ясно, что как исходное, так и переработанное изменение должны быть идемпотентными, а поскольку appschema содержит кучу CREATE TABLE, это уже не идемпотент. Кроме того, если я правильно понимаю sqitch, развертывание этого переработанного appschema вернет все мои изменения (поскольку это первое изменение в моем плане), обратно в пустую базу данных, а затем воспроизведет все обратно.

Я бы получил правильную схему, но за счет удаления всех данных. Очевидно, это не то, что я планирую делать на своей производственной цели.

Есть ли лучший способ добавить изменение, которое удаляет столбец, не обрекая sqitch verify на сбой предыдущего изменения, которое создало этот столбец? Или это ошибка проверки по замыслу?

Если по замыслу, могу ли я каким-либо образом проверить многие другие вещи, которые делает appschema изменение, но которые не изменились впоследствии (а именно, определение всего остального схемы моего приложения)?


person Jacob Ford    schedule 14.04.2020    source источник
comment
Один общий способ избежать таких проблем — разбить первоначальную миграцию схемы на отдельные небольшие миграции для каждой таблицы и для каждого изменения. Это обеспечит вам большую гибкость при внесении итерационных изменений, которые сопровождаются собственными небольшими фрагментами сценария проверки. Сценарий проверки будет точным для каждой итерации вместо одного сценария проверки для всей схемы.   -  person kachar    schedule 16.11.2020
comment
@kachar, но как это поможет? В какой-то момент столбец должен быть добавлен, и проверка проверит, что он есть, а затем, когда он будет удален, проверка все равно не удастся...   -  person singpolyma    schedule 01.03.2021
comment
@singpolyma каждая миграция имеет свой собственный SQL-скрипт проверки, поэтому в каждой точке проверка выполняется правильно. Когда мы добавляем новый столбец, мы добавляем новый скрипт проверки, чтобы проверить его. Когда мы удаляем столбец, мы добавляем сценарий проверки, чтобы проверить отсутствие столбца.   -  person kachar    schedule 02.03.2021
comment
@kachar да, но мы также запускаем все сценарии проверки для всей базы данных (при использовании sqtich verify), поэтому, если кто-то проверит, что столбец есть, а другой проверит, что его нет, произойдет сбой, и этот вопрос задается здесь IIUC.   -  person singpolyma    schedule 02.03.2021