Да, для отката вы используете функцию down
скрипта миграции. При запуске knex migrate:rollback
будет работать функция down
. В базе данных Knex есть мета-таблицы, которые используются для определения, какие миграции выполнялись или нет.
Например:
exports.up = function (knex, Promise) {
return knex.schema
.createTable('role', function (table) {
table.increments('role_id').primary();
table.string('title').notNullable().unique();
table.string('description');
table.integer('level').notNullable(),
})
.createTable('user_account', function (table) {
table.increments('user_id').primary();
table.integer('role_id').references('role_id').inTable('role').notNullable();
table.string('username').notNullable().unique();
table.string('passwordHashed').notNullable();
table.string('email', 50).notNullable().unique();
});
};
exports.down = function (knex, Promise) {
return knex.schema
.dropTable('user_account')
.dropTable('role');
};
Здесь я создаю две таблицы в функции up. user_account
имеет ограничение внешнего ключа и связывается с таблицей role
, что означает, что мне нужно удалить таблицу user_account
перед таблицей role
в функции down.
В вашем случае вы используете оператор обновления. В функции down вы должны либо сделать новое обновление с жестко запрограммированным значением (старое до миграции), либо убедиться, что вы сохранили старое значение в таблице истории.
Что касается ваших проблем:
Да, если вы добавляете много вещей, вы также должны добавить много кода, чтобы полностью изменить то, что вы делаете. Тем не менее, вы можете пропустить создание сценариев down, но тогда вы не сможете выполнить откат. Некоторые (многие?) Предпочитают только идти вперед и никогда не отступать. Если им нужно что-то исправить, они не откатываются, а создают новый сценарий миграции с исправлением.
Я бы порекомендовал вам создавать функции down в начале. Вы можете отказаться от их изготовления, когда придет время. Люди, которые не выполняют функции, обычно должны более тщательно протестировать свои миграции в тестовой или промежуточной среде, прежде чем приступить к работе. Это сделано для того, чтобы убедиться, что все работает, потому что в конце концов они не могут выполнить откат.
Я не могу ответить за создателей Knex здесь. Однако то, что вы описываете как потенциальное решение, - это, в основном, резервное копирование базы данных перед выполнением миграции. В конце концов, миграция делает больше, чем просто меняет расположение таблиц и т. Д. Сценарий миграции обычно добавляет или удаляет новые строки. Вы можете использовать подход резервного копирования, но вы должны сделать резервные копии самостоятельно.
Knex - довольно простой построитель запросов. Если вы хотите, чтобы скрипты миграции были написаны для вас, вы, возможно, захотите использовать полноценный OR mapper.