たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

神々の神殿を巡る旅路・前編 ~Entity Framework Coreで、三柱の神々と契約する~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

前回、ASP.NET Core 6.0(.NETのWebフレームワーク)とEntity Framework Core(.NETのORM)という、新たな魔法体系の基礎に触れた。しかし、真の冒険者は、そこで立ち止まらない。この現代の統一言語が、SQLite、PostgreSQL、MySQL…それぞれに異なる理(SQL方言)を持つ、古の神々と、果たして本当に対話できるのか?

今回は、主要なデータベースという名の神々と、Entity Framework Coreによる契約の儀式を執り行う。データベース接続以外の呪文は、可能な限り同じものを使う。果たして、神々はその魂の形(DDL)を、どのように我々に示してくれるのだろうか。これは、その違いを解き明かす、壮大な旅の、始まりの記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • .NET 6という新たな魔法体系に、興味を抱く者
  • 各データベースという名の神々と、Entity Framework Coreの違いに興味がある探求者
  • PostgreSQLやMySQLを、Dockerという名の祭壇で召喚したい冒険者
  • 複数のデータベースを横断的に理解し、適材適所で使い分けたいと願う技術者

砂漠の道標

  • Entity Framework Core(EF Core) - .NET用のORM(オブジェクト関係マッピング)フレームワーク。C#のクラスとデータベースを自動で対応付ける。
  • ORM(Object-Relational Mapping) - オブジェクト指向プログラミングとリレーショナルデータベースの橋渡しをする技術。
  • DDL(Data Definition Language) - CREATE TABLEなど、データベースの構造を定義するSQL文。
  • DbContext - Entity Framework Coreでデータベースとの対話を管理する中核クラス。
  • SQLite - ファイルベースの軽量データベース。サーバ不要で組み込みアプリに最適。
  • PostgreSQL - 高機能で標準SQL準拠のオープンソースRDBMS。エンタープライズ用途にも耐える信頼性。
  • MySQL - 世界で最も普及しているオープンソースRDBMS。Web開発で圧倒的なシェア。
  • Docker - アプリケーションをコンテナとして実行する仮想化技術。環境構築を劇的に簡素化する。
  • NuGet - .NET用のパッケージ管理システム。ライブラリの追加・更新を自動化する。

儀式の作法:Entity Framework Coreによる対話

今回の旅では、以下の四つの儀式を、それぞれの神殿で執り行う。

  • データベース削除 (EnsureDeletedAsync): 神殿を更地に戻す儀式(既存データベースの削除)。
  • データベース作成 (EnsureCreatedAsync): 新たな神殿を建立する儀式(テーブル構造の自動生成)。
  • テーブルへの書き込み (SaveChangesAsync): 神殿に、我々の魂を捧げる儀式(データのINSERT)。
  • テーブルからの読み込み: 捧げた魂が、確かにそこに存在することを確認する儀式(データのSELECT)。

C#の呪文は、極力シンプルに。.NET 6の「最上位レベルステートメント」という、新たな詠唱法を用いる。

第一の神殿:SQLiteという名の、旅人の水筒

SQLite(ファイルベースの軽量データベース)は、特別な祭壇(サーバ構築)を必要としない、最も手軽な神だ。NuGet(.NETのパッケージ管理システム)という名の魔法の袋からパッケージを授かるだけで、いつでもどこでも、その恩恵にあずかることができる。

魂を捧げる呪文

DbContextOnConfiguringで、UseSqliteと唱えるだけ。実にシンプルだ。

public class SampleContext : DbContext
{
    public DbSet<Sample> Samples { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=sample.db");
}

魂の形(DDL)

儀式の後に現れたテーブルの設計図(CREATE TABLE文)は、この通り。Idには、AUTOINCREMENT(自動採番機能)という、自動で魂に番号を振るう力が宿っている。

CREATE TABLE "Samples" (
    "Id" INTEGER NOT NULL CONSTRAINT "PK_Samples" PRIMARY KEY AUTOINCREMENT,
    "Name" TEXT NOT NULL
);

第二の神殿:PostgreSQLという名の、気品高き賢者

次に、Docker(コンテナ仮想化技術)という名の祭壇で、PostgreSQL(オープンソースのRDBMS)という賢者を召喚する。

$ docker run -d --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres

魂を捧げる呪文

この賢者は、小文字(スネークケース)を好む。UseNpgsql(PostgreSQL接続メソッド)と共にUseSnakeCaseNamingConvention(命名規則変換の拡張機能)という呪文を唱えることで、我々の捧げる魂の形を、賢者の好みに合わせることができる。

options.UseNpgsql("host=localhost;port=5432;database=ef;...")
       .UseSnakeCaseNamingConvention();

魂の形(DDL)

設計図を見れば、テーブル名もフィールド名も、全て美しいスネークケースに変換されているのがわかる。

CREATE TABLE public.samples (
    id int4 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    "name" text NOT NULL,
    CONSTRAINT pk_samples PRIMARY KEY (id)
);

第三の神殿:MySQLという名の、陽気な神

最後に、MySQL(世界で最も普及しているオープンソースRDBMS)という陽気な神を、同じくDockerの祭壇に召喚する。

$ docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 mysql

魂を捧げる呪文

この神との対話には、本家(Oracle公式プロバイダー)と、Pomelo(コミュニティ製プロバイダー)という二つの流派が存在する。今回は、より多くの旅人に支持されている、Pomeloの作法UseMySql(MySQL接続メソッド)を用いる。LogTo(ログ出力メソッド)などの呪文を加えれば、神との対話の様子を、より詳細に知ることができる。

options.UseMySql("server=localhost;Database=ef;...",
                 new MySqlServerVersion(new Version(8, 0, 27)))
       .LogTo(Console.WriteLine, LogLevel.Information);

魂の形(DDL)

その設計図は、文字コードへの配慮(utf8mb4)など、陽気さの中に、細やかな気配りが感じられるものだった。

CREATE TABLE `Samples` (
  `Id` int NOT NULL AUTO_INCREMENT,
  `Name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`Id`)
) ...

羊皮紙を巻く前に

前編では、SQLite、PostgreSQL、MySQLという、三柱の神々と対話した。それぞれの神が持つ、異なる個性と特徴を、この旅で垣間見ることができた。

Entity Framework Coreの真の力

驚くべきことに、DbContextUseXxxメソッド(接続プロバイダーの指定)を書き換えるだけで、ほとんど同じ呪文(C#コード)で、異なる神々と契約を結ぶことができた。データベース固有の方言(SQL方言)を意識することなく、統一されたC#の言葉で対話できる。これこそが、Entity Framework Coreという現代の統一言語の、真の力である。

三柱の神々の個性

軽量な相棒、SQLite - サーバ不要で即座に使える手軽さ - ファイル一つで完結する可搬性 - 小規模アプリケーションや組み込み用途に最適

気品高き賢者、PostgreSQL - スネークケースという美しい命名規則 - 標準SQL準拠の厳格さと高機能性 - エンタープライズ用途にも耐える信頼性

陽気な実用主義者、MySQL - Web開発で圧倒的なシェア - 文字コード(utf8mb4)への細やかな配慮 - 豊富な情報とコミュニティの支え

まとめ

後編では、今回と同様の儀式を、SQL ServerとOracleという、さらに巨大な二柱の古の神々に対して執り行う。五大神殿を巡る旅の、完結編を、どうか楽しみにしていてほしい。

この羊皮紙が、どの神を自らの相棒として選ぶべきか、広大な砂漠で途方に暮れている、未来の冒険者の助けとなることを願う。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が、何やら「ぽすとぐれ」だの「まいえすきゅーえる」だの、色んな名前の神様を、次から次へと呼び出しては、同じようなお祈りを捧げている。俺に言わせりゃ、神様なんてのは、一柱いりゃ十分だろうに。まったく、人間ってのは、浮気性な生き物だ。やれやれだぜ。