Заставить DBUP перезапускать новые скрипты во время разработки - PullRequest
0 голосов
/ 30 января 2019

Мы используем DBUP для обработки миграций БД.В каждом выпуске мы хотели бы запускать консольное приложение dbup с переключателем командной строки, чтобы во время разработки мы могли повторно запускать наши сценарии, пока мы над ними работаем, однако мы не хотим, чтобы он перезапускал все предыдущиевыпускает скрипты, которые уже появляются в базе данных.Как этого достичь?

1 Ответ

0 голосов
/ 30 января 2019

Мы добавили ключ командной строки '-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)
        ....
...