【愚公系列】2022年12月 数据库-关系数据库迁移框架FluentMigrator的使用

2022-12-15 14:30:39 浏览数 (1)

文章目录

前言

一、关系数据库迁移框架FluentMigrator的使用

总结

前言

Fluent Migrator是一个.NET迁移框架。迁移是一种改变数据库模式的结构化方法,是创建大量sql脚本的一种替代方法,每个开发人员都必须手动运行这些脚本。它提供了一个简洁的 Fluent API,可以让你使用 C# 写出简洁的迁移脚本,轻松地管理数据库迁移,这对于敏捷开发项目特别有用。比如,当开发团队的成员对数据库做出更改时,FluentMigrator 可以自动检测并应用这些更改,从而确保数据库保持一致性。。

FluentMigrator 提供了一系列的 API 用来创建和管理数据库迁移,并且支持多种不同的数据库系统,包括 MySQL、PostgreSQL 和 SQL Server 等。

FluentMigrator官网网址:https://github.com/fluentmigrator/fluentmigrator

文档地址:https://fluentmigrator.github.io/

一、关系数据库迁移框架FluentMigrator的使用

1、首先,创建一个控制台项目。

代码语言:javascript复制
dotnet new console --name ConsoleTest

2、添加以下 Nuget 包, 这里我们使用了 SQLite 数据库。

代码语言:javascript复制
dotnet add package FluentMigrator

dotnet add package FluentMigrator.Runner

dotnet add package FluentMigrator.Runner.SQLite

dotnet add package Microsoft.Data.Sqlite

3、创建一个迁移类

代码语言:javascript复制
using FluentMigrator;

namespace ConsoleTest
{
    [Migration(20221214121800)]
    public class AddLogTable : Migration
    {
        public override void Up()
        {
            Create.Table("Log")
                .WithColumn("Id").AsInt64().PrimaryKey().Identity()
                .WithColumn("Text").AsString();
        }

        public override void Down()
        {
            Delete.Table("Log");
        }
    }
}

4、使用下面的代码,运行迁移

代码语言:javascript复制
using FluentMigrator.Runner;


using Microsoft.Extensions.DependencyInjection;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var serviceProvider = CreateServices();

            using (var scope = serviceProvider.CreateScope())
            {
                UpdateDatabase(scope.ServiceProvider);
            }
        }

        /// <summary>
        /// 创建迁移服务
        /// </summary>
        /// <returns></returns>
        private static IServiceProvider CreateServices()
        {
            return new ServiceCollection()
                .AddFluentMigratorCore()
                .ConfigureRunner(rb => rb
                    .AddSQLite()//可以换成其他数据库
                    .WithGlobalConnectionString("Data Source=test.db")
                    .ScanIn(typeof(AddLogTable).Assembly).For.Migrations())
                .AddLogging(lb => lb.AddFluentMigratorConsole())
                .BuildServiceProvider(false);
        }

        /// <summary>
        /// 更新数据库
        /// </summary>
        /// <param name="serviceProvider"></param>
        private static void UpdateDatabase(IServiceProvider serviceProvider)
        {
            var runner = serviceProvider.GetRequiredService<IMigrationRunner>();

            runner.MigrateUp();
        }
    }
}

运行上面的代码,程序会自动运行迁移,创建指定的 Log 表。

5、回滚迁移

代码语言:javascript复制
using FluentMigrator.Runner;


using Microsoft.Extensions.DependencyInjection;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var serviceProvider = CreateServices();

            using (var scope = serviceProvider.CreateScope())
            {
                UpdateDatabase(scope.ServiceProvider);
            }
        }

        /// <summary>
        /// 创建迁移服务
        /// </summary>
        /// <returns></returns>
        private static IServiceProvider CreateServices()
        {
            return new ServiceCollection()
                .AddFluentMigratorCore()
                .ConfigureRunner(rb => rb
                    .AddSQLite()//可以换成其他数据库
                    .WithGlobalConnectionString("Data Source=test.db")
                    .ScanIn(typeof(AddLogTable).Assembly).For.Migrations())
                .AddLogging(lb => lb.AddFluentMigratorConsole())
                .BuildServiceProvider(false);
        }

        /// <summary>
        /// 更新数据库
        /// </summary>
        /// <param name="serviceProvider"></param>
        private static void UpdateDatabase(IServiceProvider serviceProvider)
        {
            var runner = serviceProvider.GetRequiredService<IMigrationRunner>();

            //runner.MigrateUp();
            //回滚迁移
            runner.Rollback(1);
        }
    }
}

6、进程外执行迁移

安卓包

代码语言:javascript复制
dotnet tool install -g fluentmigrator.dotnet.cli

迁移命令

代码语言:javascript复制
dotnet fm migrate -p 数据库类型 -c  "连接字符串" -a "迁移类的程序集路径" 

其他命令 command 可选值为down/up, 如果不指定,默认是up, 即运行所有还未运行过的数据库迁移类

总结

FluentMigrator 的主要优点在于它的易用性和灵活性。它的语法简洁明了,能够让开发人员快速编写数据库迁移脚本。此外,FluentMigrator 还支持在迁移过程中执行多种操作,包括创建表、添加字段、修改表结构等。

总之,FluentMigrator 是一款优秀的数据库迁移工具,能够为开发人员提供简洁、灵活的方式来管理数据库迁移。

0 人点赞