Заставить DBUP перезапускать новые скрипты во время разработки
Мы используем DBUP для обработки миграции БД. В каждом выпуске мы хотели бы запускать консольное приложение dbup с переключателем командной строки, чтобы во время разработки мы могли повторно запускать наши сценарии, пока мы над ними работаем, однако мы не хотим, чтобы он перезапускал все предыдущие выпускает скрипты, которые уже появляются в базе данных. Как этого достичь?
1 ответ
Мы добавили ключ командной строки '-debug' в наше консольное приложение DbUp. Если это присутствует, мы переключаемся, какой класс Journal используется при обращении к базе данных.
Класс Journal ( https://dbup.readthedocs.io/en/latest/more-info/journaling/) в DbUp - это класс, который взаимодействует с базой данных, чтобы проверять и записывать, какие сценарии уже были запущены (по умолчанию хранятся в таблица версий схемы). Для Dev мы заставляем это использовать версию только для чтения, которая может проверять, какие сценарии уже присутствуют (чтобы вы не запускали все заново каждый раз), но предотвращает запись новых записей, так что в следующий раз он попытается Перезапустите ваши новые скрипты снова.
Журнал только для чтения выглядит следующим образом;
public class ReadOnlyJournal : IJournal
{
private readonly IJournal _innerJournal;
public ReadOnlyJournal(IJournal innerJournal)
{
_innerJournal = innerJournal;
}
public void EnsureTableExistsAndIsLatestVersion(Func<IDbCommand> dbCommandFactory)
{
_innerJournal.EnsureTableExistsAndIsLatestVersion(dbCommandFactory);
}
public string[] GetExecutedScripts()
{
return _innerJournal.GetExecutedScripts().ToArray();
}
public void StoreExecutedScript(SqlScript script, Func<IDbCommand> dbCommandFactory)
{
// don't store anything
}
}
Затем метод расширения, позволяющий легче определить использование этого нового журнала;
public static class DbUpHelper
{
public static UpgradeEngineBuilder WithReadOnlyJournal(this UpgradeEngineBuilder builder, string schema, string table)
{
builder.Configure(c => c.Journal = new ReadOnlyJournal(new SqlTableJournal(() => c.ConnectionManager, () => c.Log, schema, table)));
return builder;
}
}
И, наконец, изменение вашего консольного приложения DbUp;
var upgrader = debug
? DeployChanges.To
.SqlDatabase(connectionString)
.WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
.WithReadOnlyJournal("dbo", "SchemaVersions")
.LogToConsole()
.Build()
: DeployChanges.To
.SqlDatabase(connectionString)
.WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
.LogToConsole()
.Build();
var result = upgrader.PerformUpgrade();
if (!result.Successful)
....