我也使用FluentMigrator 3.2.1和dotnet-fm来运行迁移。想象一下,我有数据库版本1,2,3,4,依此类推,类标记为
[FluentMigrator.Migration(1, "1")]
[FluentMigrator.Migration(2, "2")]
[FluentMigrator.Migration(3, "3")]
[FluentMigrator.Migration(4, "4")]
并且它们都覆盖了Up()和Down()方法。在开发环境中,我具有数据库版本4。我使用新版本的存储过程来修改“ up”脚本。数据库已经在VersionInfo表中具有版本4,并且我执行此命令]
dotnet-fm migrate -p Postgres -c "Server=192.168...server info" -a "/mnt/d/src/........DB.dll" up
我希望迁移器再次“强制”更新到版本4,但是看起来该数据库的版本已经是4。我曾经回滚到3并回滚到最新的,但是它不方便并且不适合CI / CD。有没有什么优雅的方法可以“强制”“向上”迁移,例如。有迁移标签吗?
我是FluentMigrator的共同维护者之一。框架不支持此功能,但是有一种解决方法以及一种思考如何构建构建过程的方法。
最简单的解决方法是使用psql
删除最新的迁移:
psql -U username -h 192.160.128.101 -d mydatabase -c 'DELETE FROM VersionInfo WHERE Id = 4'
您可以使用bash
并为此命令创建一个函数。注意,您必须创建一个函数if you want to make this command accept a parameter。
fm-rm()
{
# THIS DOES NO ERROR CHECKING.
# DO NOT RUN THIS AGAINST A PRODUCTION SERVER.
psql -U username -h $1 -d $2 -c 'DELETE FROM VersionInfo WHERE Id = $3'
}
如果您在开发环境中运行这些迁移,那么您想要的是一个工作流程,用于创建测试数据库,然后针对该测试数据库运行迁移。
根据您在示例中提供的命令行参数,看起来您正在使用非Windows环境并正在使用PostgreSql。我要为其添加示例的替代解决方案是TestEnvironment.Docker
,然后通过docker旋转SQL Server容器。 (不幸的是,SqlLocalDb在Linux上不可用,而您使用的是PostgreSql。在Windows上,SqlLocalDb将是用于简化测试服务器和测试数据库的理想轻量级解决方案。)
[如果您使用的是MSBuild,还可以定义一个TestSetup
目标来建立DatabaseName_UnitTest数据库。执行此操作时,我将运行一个基线CreateSchema.sql,并在某个时间点创建一个数据库和该架构,然后应用所有迁移。这样,我可以保证发布过程应该正常工作,特别是如果我使用的是类似GitFlow的发布模型,那么我只能在master分支之外进行部署。]