首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制DBUP在开发期间重新运行新脚本

强制DBUP在开发期间重新运行新脚本
EN

Stack Overflow用户
提问于 2019-01-30 14:42:09
回答 1查看 1.4K关注 0票数 2

我们使用DBUP来处理db迁移。每个版本,我们都希望使用命令行开关运行dbup控制台应用程序,以便在开发过程中我们可以在处理脚本时重新运行脚本,但是我们不希望它重新运行数据库中已经出现的所有以前的版本脚本。如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 14:42:09

我们在DbUp控制台应用程序中添加了一个“调试”命令行开关。如果存在这种情况,则在与数据库对话时切换使用哪个Journal类。

日志类(https://dbup.readthedocs.io/en/latest/more-info/journaling/)是与数据库交互以检查和记录哪些脚本已经运行(默认情况下存储在架构版本表中)的类。对于Dev,我们强制它使用只读版本,它可以检查哪些脚本已经存在(以防止每次重新运行所有脚本),但防止新记录被记录,以便下次它将再次尝试重新运行您的新脚本。

只读日记是这样的;

代码语言:javascript
复制
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
    }
}

然后是一个扩展方法,允许更容易地指定这个新日志的使用;

代码语言:javascript
复制
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控制台应用程序进行更改;

代码语言:javascript
复制
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)
        ....
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54443131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档