어떻게 Fluent Migrator 를 이용 하여 데이터베이스 이전 을 실현 합 니까?

FluentMigrator
Fluent Migrator 는.NET 기반 의 이전 프레임 워 크 로 Ruby on Rails Migrations 처럼 사용 할 수 있 습 니 다.Fluent Migrator 의 최신 버 전 은 3.13 버 전 이 며 홈 페이지 주 소 는 https://github.com/fluentmigrator/fluentmigrator 입 니 다.SQL 스 크 립 트 를 작성 하지 않 고 C\#로 데이터베이스 이전 클래스 를 작성 할 수 있 습 니 다.사용 방식 으로 볼 때 EF/EF Core 의 데이터베이스 이전 스 크 립 트 와 매우 비슷 하지만 지원 하 는 데이터베이스 유형 은 EF/EF Core 보다 많 고 제한 을 받 지 않 으 며 EF/EF Core 와 같 습 니 다.
지원 하 는 데이터베이스 목록
  • Microsoft SQL Server 2017
  • Microsoft SQL Server 2016
  • Microsoft SQL Server 2014
  • Microsoft SQL Server 2008
  • Microsoft SQL Server 2005
  • Microsoft SQL Server 2000
  • Microsoft SQL Server Compact Edition
  • PostgreSQL
  • MySQL 4
  • MySQL 5
  • Oracle
  • Oracle (managed ADO.NET)
  • Oracle (DotConnect ADO.NET)
  • Microsoft JET Engine (Access)
  • SQLite
  • Firebird
  • Amazon Redshift
  • SAP Hana
  • SAP SQL Anywhere
  • DB2
  • DB2 iSeries
  • Fluent Migrator 는 서로 다른 장면 을 지원 하기 위해 5 개의 서로 다른 라 이브 러 리 를 제공 합 니 다.
    Package
    묘사 하 다.
    FluentMigrator
    데이터베이스 생 성 에 필요 한 기본 프로그램 집합
    FluentMigrator.Runner
    프로 세 스 내 데이터베이스 이전 에 필요 한 프로그램 집합
    FluentMigrator.Console
    프로 세 스 밖에서 데이터베이스 이전 에 필요 한 프로그램 집합 을 실행 합 니 다..NET 4.0/4.5/.NET Core 2.0 을 호 환 합 니 다.
    FluentMigrator.MSBuild
    .NET 4.0/4.5/.NET Standard 2.0 을 호 환 하 는 MSBuild 작업
    FluentMigrator.DotNet.Cli
    데이터베이스 이전 을 실행 할 수 있 는.NET Core CLI 도구
    입문 예
    여기 서 우 리 는 먼저 가장 간단 한 데이터베이스 이전 예 를 보 여 주 며,MySql 데이터베이스 에 로그 표를 추가 합 니 다.
    콘 솔 프로그램 만 들 기
    .NET Core CLI 를 사용 하여.NET Core 명령 행 프로그램 을 만 듭 니 다.
    
    #        
    dotnet add package FluentMigrator
    
    #        
    dotnet add package FluentMigrator.Runner
    
    #   MySQL        
    dotnet add package FluentMigrator.Runner.MySQL
    
    # ADO.NET  MySQL    
    dotnet add package MySQL.Data
    첫 번 째 데이터베이스 이전 클래스 추가
    로그 라 는 표를 만 들 지 않 았 습 니 다.데이터베이스 이전 클래스 를 만들어 야 합 니 다.
  • Log 표 에는 2 개의 필드 가 있 고 하 나 는 Id 필드 이 며 하 나 는 Text 필드
  • 입 니 다.
  • Id 필드 는 Int 64 형식의 메 인 키 이 고
  • 이 증가 합 니 다.
  • Text 필드 는 문자열 필드
  • 입 니 다.
    
    using FluentMigrator;
    
    namespace test
    {
     [Migration(20180430121800)]
     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");
      }
     }
    }
    실행 이동 클래스
    이전 클래스 를 작성 한 후에 우 리 는 이전 클래스 를 실행 할 수 있 습 니 다.
    Fluent Migrator 는 이전 스 크 립 트 를 실행 하 는 두 가지 방식 이 있 습 니 다.
  • 프로 세 스 내 실행 기 사용(추천)
  • 프로 세 스 외 실행 기 사용
  • 프로 세 스 실행 기 사용
    내부 실행 기 란 Fluent Migrator.Runner 라 이브 러 리 를 통 해 프로그램 내부 에서 IMigration Runner 인터페이스 대상 의 MigrateUp 방법 으로 데이터 베 이 스 를 이동 하 는 것 입 니 다.
    여기 서 우 리 는 Program.cs 파일 을 다음 과 같이 수정 할 수 있다.
    
     class Program
     {
      static void Main(string[] args)
      {
       var serviceProvider = CreateServices();
    
       using (var scope = serviceProvider.CreateScope())
       {
        UpdateDatabase(scope.ServiceProvider);
       }
      }
    
      private static IServiceProvider CreateServices()
      {
       return new ServiceCollection()
        //  FluentMigrator    
        .AddFluentMigratorCore()
        .ConfigureRunner(rb => rb
         //  MySql 5.0  
         .AddMySql5()
         //       
         .WithGlobalConnectionString("server=localhost;port=3307;Database=abc;UID=root;PWD=123456")
         //      
         .ScanIn(typeof(AddLogTable).Assembly).For.Migrations())
        //       
        .AddLogging(lb => lb.AddFluentMigratorConsole())
        //       
        .BuildServiceProvider(false);
      }
    
      private static void UpdateDatabase(IServiceProvider serviceProvider)
      {
       //           
       var runner = serviceProvider.GetRequiredService<IMigrationRunner>();
    
       //      
       runner.MigrateUp();
      }
     }
    프로그램 을 시작 하면 이동 이 자동 으로 완 료 됩 니 다.
     
    프로 세 스 외부 실행 기 사용 하기
    외부 이전 실행 기 를 사용 하려 면.NET Core 2.1 이상 버 전의 SDK 가 설치 되 어 있 음 을 보증 해 야 합 니 다..NET Core 2.1 이후 추 가 된 Global Tool 기능 이 필요 하기 때 문 입 니 다.
    여기 서 우 리 는 명령 행 을 사용 하여 Fluent Migrator.DotNet.cli 도 구 를 추가 할 수 있 습 니 다.
    
    dotnet tool install -g FluentMigrator.DotNet.Cli
    설치 가 끝 난 후에 우 리 는 이 도 구 를 사용 하여 데이터 베 이 스 를 이전 할 수 있다.
    
    dotnet fm migrate -p mysql -c "server=localhost;port=3307;Database=abc;UID=root;PWD=123456" -a ".\bin\Debug
    etcoreapp2.1\test.dll"
    이 방법 은 세 개의 매개 변수 가 있 습 니 다.첫 번 째 매개 변수-p 는 데이터 뱅 크 의 유형 을 지정 하고 두 번 째 매개 변수-c 는 연결 문자열 을 지정 하 며 세 번 째 매개 변수-a 는 이전 류 를 포함 한 프로그램 집합 경 로 를 지정 합 니 다.
    메모:사실 여기 네 번 째 매개 변수 command 가 있 습 니 다.선택 할 수 있 는 값 은 down/up 입 니 다.지정 하지 않 으 면 기본 값 은 up 입 니 다.즉,실행 되 지 않 은 모든 데이터베이스 이전 류 를 실행 합 니 다.
    방법 이 실 행 된 후,효 과 는 프로 세 스 내 실행 기의 효과 와 일치 합 니 다.
    기본 개념
    간단 한 예 시 를 보 여 준 후에 우 리 는 Fluent Migrator 의 기본 개념 을 살 펴 보 자.
    이전(Migrations)
    Fluent Migrator 에서 가장 기본 적 인 요 소 는 이전 유형 입 니 다.모든 이전 유형 은 Migration 이라는 추상 적 인 유형 을 계승 하고 두 가지 추상 적 인 방법 인 Up 과 Down 을 실현 해 야 합 니 다.말 그대로 Up 방법 은 현재 의 데이터 베이스 변경 을 실행 하 는 것 입 니 다.Down 방법 은 현재 의 데이터 베 이 스 를 다시 굴 리 는 것 입 니 다.
    
    [Migration(1)]
    public class CreateUserTable : Migration
    {
     public override void Up()
     {
      Create.Table("Users");
     }
    
     public override void Down()
     {
      Delete.Table("Users");
     }
    }
    이전 클래스 의 머리 에 Migration 의 특성 이 있 음 을 알 수 있 습 니 다.값 은 1 입 니 다.여 기 는 이전 클래스 가 실 행 될 순 서 를 지정 한 것 입 니 다.번호 가 작은 이전 클래스 일수 록 먼저 실 행 됩 니 다.(일부 개발 자 시스템 은 현재 날짜 의 yyyMMddHHmmss 형식 으로 이전 클래스 를 표시 합 니 다)이 번 호 는 유일 해 야 합 니 다.중복 할 수 없습니다.
    Fluent 인터페이스(Fluent 인터페이스)
    Fluent Migrator 는 매우 풍부 한 fluent api 를 제공 합 니 다.우 리 는 이 api 를 사용 하여 표,열,색인 을 만 들 수 있 습 니 다.기본적으로 네가 사용 할 수 있 는 대부분의 장면 을 그것 은 모두 지지한다.
    표현 식 만 들 기(표현 식 만 들 기)
    표,열,색인,외 키,조직 구조(schema)를 추가 하기 위해 표현 식 을 만 들 수 있 습 니 다.
    
    Create.Table("Users")
      .WithIdColumn() 
      .WithColumn("Name").AsString().NotNullable();
    주:WithIdColumn()은 확장 방법 입 니 다.WithColumn("Id").Asint 32().NotNullable().Primary Key().Identity()와 같 습 니 다.
    
    Create.ForeignKey() 
      .FromTable("Users").ForeignColumn("CompanyId")
      .ToTable("Company").PrimaryColumn("Id");
    표현 식 변경(Alter Expression)
    존재 하 는 표 와 열 을 변경 하 는 데 사용 합 니 다.
    
    Alter.Table("Bar")
      .AddColumn("SomeDate")
      .AsDateTime()
      .Nullable();
    
    Alter.Table("Bar")
      .AlterColumn("SomeDate")
      .AsDateTime()
      .NotNullable();
    
    Alter.Column("SomeDate")
      .OnTable("Bar")
      .AsDateTime()
      .NotNullable();
    표현 식 삭제(표현 식 삭제)
    표,열,외 키,조직 구조 삭제(Schema)
    
    Delete.Table("Users");
    여러 열 삭제(여러 열 삭제)
    Fluent Migrator 도 여러 열 을 삭제 하 는 문법 을 제공 합 니 다.
    
    Delete.Column("AllowSubscription").Column("SubscriptionDate").FromTable("Users");
    스 크 립 트 실행(표현 식 실행)
    사용자 정의 SQL 스 크 립 트 를 실행 하거나 지정 한 SQL 스 크 립 트 파일 을 실행 할 수 있 도록 합 니 다.
    
    Execute.Script("myscript.sql");
    Execute.EmbeddedScript("UpdateLegacySP.sql");
    Execute.Sql("DELETE TABLE Users");
    Embeddedscript 방법 도 지정 한 SQL 스 크 립 트 파일 을 실행 하지만 파일 원본 Embeddedscript 에서 읽 습 니 다.Embedscript 를 사용 하려 면 지정 한 SQL 스 크 립 트 파일 의 Build Action 속성 을 Embedscript 리 소스 로 설정 하면 됩 니 다.
    표현 식 이름 바 꾸 기(표현 식 이름 바 꾸 기)
    표 나 열 이름 바 꾸 기 허용
    
    Rename.Table("Users").To("UsersNew");
    Rename.Column("LastName").OnTable("Users").To("Surname");
    데이터 조작 식(데이터 표현 식)
    데이터베이스 데이터 에 대한 추가/수정/삭제 작업 허용
    
    Insert.IntoTable("Users").Row(new { FirstName = "John", LastName = "Smith" });
    
    Delete.FromTable("Users").AllRows(); //     
    Delete.FromTable("Users").Row(new { FirstName = "John" }); //    FirstName = John    
    Delete.FromTable("Users").IsNull("Username"); //    Username      
    
    Update.Table("Users").Set(new { Name = "John" }).Where(new { Name = "Johnanna" });
    데이터베이스 형식 판단 식(IfDatabase Expression)
    데이터베이스 형식 에 따라 데이터베이스 이전 작업 을 수행 할 수 있 습 니 다.
    
    IfDatabase("SqlServer", "Postgres")
      .Create.Table("Users")
      .WithIdColumn()
      .WithColumn("Name").AsString().NotNullable();
    
    IfDatabase("Sqlite")
      .Create.Table("Users")
      .WithColumn("Id").AsInt16().PrimaryKey()
      .WithColumn("Name").AsString().NotNullable();
    조직 구조 존재 표현 식(Schema.Exists Expressions)
    조직 구조 가 이미 존재 하 는 지,예 를 들 어 표 가 존재 하 는 지,열 이 존재 하 는 지 등 을 판단 하 는 데 사용 된다.
    
    if (!Schema.Table("Users").Column("FirstName").Exists())
    {
      this.Create.Column("FirstName").OnTable("Users").AsAnsiString(128).Nullable();
    }
    설정(프로필)
    Fluent Migrator 는 Profile 의 특성 도 제공 합 니 다.이 설정 을 사용 하면 개발 자 들 은 서로 다른 환경(개발 환경,테스트 환경,생산 환경 등)에 대해 서로 다른 스 크 립 트 를 실행 할 수 있 습 니 다.
    
    [Profile("Development")]
    public class CreateDevSeedData : Migration
    {
      public override void Up()
      {
        Insert.IntoTable( "User" ).Row( new
          {
            Username = "devuser1",
            DisplayName = "Dev User"
          });
      }
    
      public override void Down()
      {
        //empty, not using
      }
    }
    EF/EF Core 스 크 립 트 이전 과 비교
    Fluent Migrator 의 데이터베이스 스 크 립 트 이전 은 EF/EF Core 와 매우 유사 합 니 다.
    유사 점:
  • EF/EF Core 를 사용 하여 데이터 베 이 스 를 이전 할 때 현재 데이터 베이스 에 을 만 듭 니 다.EFMigrations History 표,실행 중인 스 크 립 트 Id 를 저장 합 니 다.
  • 저희 가 Fluent Migrator 를 사용 하여 데이터베이스 이전 을 할 때 데이터베이스 에 VersionInfo 표를 만 들 고 실 행 된 스 크 립 트 Id
  • 을 저장 합 니 다.
    구별:
  • EF/EF Core 의 이전 스 크 립 트 는 EF 컨 텍스트 설정 과 최신 Model Snapshot 에 따라 자동 으로 생 성 되 어 더욱 편리 합 니 다.Fluent Migrator 의 이전 스 크 립 트 는 모두 수 동 으로 작성 해 야 하 며 좀 더 유연 해 야 합 니 다.
  • EF/EF Core 는 자동 으로 생 성 되 는 이전 파일 마다 cs 파일 하나,design.cs 파일 하나,cs 파일 마다 자동 으로 생 성 되 는 스 크 립 트 클래스 가 포함 되 어 있 으 며,design.cs 에는 현재 이전 클래스 에 대한 최신 ModelSnapshot 이 포함 되 어 있 기 때문에 EF/EF Core 를 다시 사용 하면 마지막 으로 누적 생 성 된 design.cs 파일 이 매우 큽 니 다.Fluent Migrator 의 모든 이전 클래스 는 자신 이 작성 한 것 으로 이번 이전 내용 만 포함 되 어 있 기 때문에 부피 가 더 작 습 니 다.
  • 총결산
    이 편 에서 저 는 Fluent Migrator 의 기본 적 인 용법 과 EF/EF Core 스 크 립 트 이전 과 의 차 이 를 묘 사 했 습 니 다.만약 에 무 거 운 EF/EF Core 사용자 가 아니라면 Fluent Migrator 를 사용 하여 데이터 베 이 스 를 이전 해 보 세 요.
    자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기