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

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

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

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

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

今回は、この二柱の古き神々を、Dockerという名の祭壇に召喚し、Entity Framework Coreという現代の言葉で、その魂の形(DDL)を読み解く。これは、五大神殿を巡る、壮大な旅の、完結編である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • .NET 6という新たな魔法体系に、興味を抱く者
  • SQL ServerやOracleという、古の神々と、Entity Framework Coreで対話したいと願う探求者
  • Dockerという名の祭壇で、巨大な神々を召喚する儀式に興味がある冒険者

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

まずは、Dockerを使い、最新のSQL Serverを召喚する。パスワードという名の合言葉は、生半可なものでは神の怒りに触れるため、注意が必要だ。

$ 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という名の、神殿の奥深くにある聖域を目指し、UseOracleの呪文で、その場所を正確に指定せねばならない。

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 ..., 
    ...
   ) ...

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

羊皮紙を巻く前に:五大神殿を巡りて

五柱の神々との対話を終え、私はそれぞれの神が持つ、異なる個性と哲学を垣間見た。

秩序の神、SQL Server。 その魂はLinuxの大地にも降臨するが、我々の世界(C#)から対話するには、その在り処(IPアドレス)を正確に伝える必要がある。また、魂の欠片(Id)には、自らの意志(IDENTITY)で番号を刻むため、我々が手を下すことは許されない。

太古の神、Oracle。 その召喚の儀は、他の神々とは比較にならぬほど長く、忍耐を要する。そして、我々の願いに応えて示される魂の形(DDL)は、まるで叙事詩のように長大で、その神威の大きさを我々に知らしめるのだ。

Entity Framework Coreという現代の言葉さえあれば、我々は、これほどまでに多様な神々と、対話することができる。この羊皮紙が、あんたの旅の、良き相棒選びの助けとなることを願う。

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

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

ラクダの独り言

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