어떻게 Fluent Migrator 를 이용 하여 데이터베이스 이전 을 실현 합 니까?
12149 단어 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 와 같 습 니 다.
지원 하 는 데이터베이스 목록
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
첫 번 째 데이터베이스 이전 클래스 추가로그 라 는 표를 만 들 지 않 았 습 니 다.데이터베이스 이전 클래스 를 만들어 야 합 니 다.
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 와 매우 유사 합 니 다.
유사 점:
구별:
이 편 에서 저 는 Fluent Migrator 의 기본 적 인 용법 과 EF/EF Core 스 크 립 트 이전 과 의 차 이 를 묘 사 했 습 니 다.만약 에 무 거 운 EF/EF Core 사용자 가 아니라면 Fluent Migrator 를 사용 하여 데이터 베 이 스 를 이전 해 보 세 요.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PostgreSQL: Java 는 CopyManager 를 사용 하여 클 라 이언 트 파일 COPY 가 져 오기 를 실현 합 니 다.MySQL 에 서 는 LOAD DATA INFILE 과 LOAD DATA LOCAL INFILE 두 가지 방식 으로 텍스트 파일 의 데 이 터 를 데이터베이스 시트 에 가 져 올 수 있어 속도 가 매우 빠르다.이 중...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.