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

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

神々の神殿を巡る旅路・後編 ~SQL ServerとOracle、二柱の古き神々との契約~

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

前回の旅で、我々はSQLite, PostgreSQL, MySQLという、三柱の神々と契約を結んだ。しかし、この砂漠には、さらに巨大で、そして厳格な理(ことわり)に支配された、二柱の古の神々が存在する。SQL ServerOracleだ。

今回は、この二柱の古き神々を、Docker(コンテナ仮想化技術)という名の祭壇に召喚し、Entity Framework Core(.NETのORM)という現代の言葉で、その魂の形(DDL:テーブル定義)を読み解く。これは、五大神殿を巡る、壮大な旅の、完結編である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • .NET 6という新たな魔法体系に、興味を抱く者
  • SQL ServerやOracleという、古の神々と、Entity Framework Coreで対話したいと願う探求者
  • Dockerという名の祭壇で、巨大な神々を召喚する儀式に興味がある冒険者
  • 前編の旅(SQLite、PostgreSQL、MySQL)を終え、さらなる神々との契約を目指す旅人

砂漠の道標

  • SQL Server - Microsoft製の商用データベース管理システム。Windows環境で広く使われるエンタープライズ向けRDBMS。
  • Oracle Database - Oracle社が開発する世界最大規模の商用データベース。金融・大企業で圧倒的なシェアを持つ。
  • Docker - アプリケーションをコンテナとして実行する仮想化技術。環境構築を劇的に簡素化する。
  • Entity Framework Core - .NET用のORM(オブジェクト関係マッピング)フレームワーク。C#のクラスとデータベースを自動で対応付ける。
  • DDL(Data Definition Language) - CREATE TABLEなど、データベースの構造を定義するSQL文。
  • IDENTITY - SQL Serverの自動採番機能。挿入時に自動的に連番を割り当てる。
  • Pluggable Database(PDB) - Oracle Database 12c以降の機能。複数の独立したデータベースを1つのインスタンスで管理できる。
  • ORM(Object-Relational Mapping) - オブジェクト指向プログラミングとリレーショナルデータベースの橋渡しをする技術。

第一の儀式:SQL Serverという名の、秩序の神との契約

まずは、Docker(コンテナ仮想化技術)を使い、最新のSQL Server(Microsoft製の商用データベース)を召喚する。パスワード(SA_PASSWORD環境変数)という名の合言葉は、生半可なものでは神の怒りに触れるため、注意が必要だ。

$ docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=@Passw0rd" ...

神殿の作法

この神は、Idという名の魂の欠片(主キー)に、自動で番号を振るう「IDENTITY」(自動採番機能)という性質を持つ。 我々が捧げる魂の形(クラス)が、たとえこうであっても…

public class Sample
{
    public int Id { get; set; }
    public string Name { get; set; }
}

…我々が勝手にIdに値を設定しようとすると、「IDENTITY_INSERTがOFFだ」と、神の怒りを買うことになる。よって、魂を捧げる際は、Idを指定せず、神の御心に委ねるのが、正しい作法だ。

魂の形(DDL)

儀式の後に生成されたテーブルの設計図は、この通り。Idには、IDENTITY(1,1)という、自動採番の刻印が確かに押されている。

CREATE TABLE ... ( Id int IDENTITY(1,1) NOT NULL, ... );

第二の儀式:Oracleという名の、太古の神との契約

次に、Oracle 21c XEという、最も古く、最も荘厳な神を召喚する。この儀式は複雑を極め、dockerイメージの錬成だけで、長大な時間を要する。

# 儀式の準備
$ git clone https://github.com/oracle/docker-images
$ cd .../dockerfiles/21.3.0
$ wget https://.../oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
# 錬成の開始
$ ./buildContainerImage.sh -v 21.3.0 -x -i

そして、錬成したイメージから神を召喚し、その声(ログ)に耳を澄ませる。「DATABASE IS READY TO USE!」という神託が聞こえるまで、我々はただ、じっと待つしかない。

$ docker run -e "ORACLE_PWD=oracle" ...
$ docker logs -f oracle
...
#########################
DATABASE IS READY TO USE!
#########################
...

神殿の作法

この神と対話するには、XEPDB1(Pluggable Database名)という名の、神殿の奥深くにある聖域を目指し、UseOracle(Entity Framework CoreのOracle接続メソッド)の呪文で、その場所を正確に指定せねばならない。

public class SampleContext : DbContext
{
    public DbSet<Sample> Samples { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseOracle("User ID=EF;Password=oracle;Data Source=localhost/XEPDB1");
}

魂の形(DDL)

他の神々が数行で済ませた魂の設計図を、この太古の神は、まるで叙事詩のように、長大かつ荘厳な言葉で紡ぎ出す。

CREATE TABLE "EF"."Samples" 
   (    "Id" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY ..., 
    ...
   ) ...

その過剰とも思えるほどの詳細さに、我々はただ、神の偉大さを前に、ひれ伏すしかない。

羊皮紙を巻く前に

五柱の神々との対話を終え、私はそれぞれの神が持つ、異なる個性と哲学を垣間見た。前編の三柱(SQLite、PostgreSQL、MySQL)が、比較的穏やかで近づきやすい神々であったのに対し、今回の二柱は、その召喚と契約に、より深い覚悟と理解を要求する、真に「古の神々」であった。

SQL ServerとOracleの対照的な個性

秩序の神、SQL Server - Linuxという異郷の地にも降臨する柔軟性を持つ - 魂の欠片(Id)には自らの意志(IDENTITY)で番号を刻む - 我々が勝手に番号を設定することは、神の秩序への冒涜となる - 比較的シンプルな召喚の儀式で、すぐに対話を開始できる

太古の神、Oracle - 召喚の儀式は他の神々とは比較にならぬほど長く、忍耐を要する - dockerイメージの錬成だけで、数十分という長大な時間が必要 - 魂の形(DDL)は叙事詩のように長大で、その神威の大きさを誇示する - XEPDB1という聖域への正確な道案内が必須

Entity Framework Coreという万能の言葉

この旅で最も重要な発見は、Entity Framework Coreという現代の言葉さえあれば、我々は、これほどまでに多様な神々と、統一された作法で対話できるという事実だ。五柱の神々は、それぞれ異なる方言(SQL方言)を話すが、Entity Framework Coreという通訳が、我々の意図を適切に翻訳してくれる。

まとめ

前編の三柱と、今回の二柱を合わせた五大神殿を巡る旅は、こうして完結した。軽量な相棒を求めるならSQLite、バランスを重視するならPostgreSQL、Webの世界で生きるならMySQL、.NETの世界に住まうならSQL Server、そして最大級の荘厳さを求めるならOracle。あんたの旅路に、どの神々が相応しいかは、あんた自身が決めることだ。

この羊皮紙が、あんたの旅の、良き相棒選びの助けとなることを願う。

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

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

ラクダの独り言

ご主人が「これで五大神殿を制覇した!」とか言って、やけに得意げになっている。俺に言わせりゃ、どこの神様だろうと、ちゃんと美味い草と、冷たい水を授けてくれる神様が、一番偉い神様なんだがな。まったく、人間ってのは、すぐに序列をつけたがるもんだ。やれやれだぜ。