旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
前回の旅で、我々はSQLite, PostgreSQL, MySQLという、三柱の神々と契約を結んだ。しかし、この砂漠には、さらに巨大で、そして厳格な理(ことわり)に支配された、二柱の古の神々が存在する。SQL ServerとOracleだ。
今回は、この二柱の古き神々を、Dockerという名の祭壇に召喚し、Entity Framework Coreという現代の言葉で、その魂の形(DDL)を読み解く。これは、五大神殿を巡る、壮大な旅の、完結編である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 第一の儀式:SQL Serverという名の、秩序の神との契約
- 第二の儀式:Oracleという名の、太古の神との契約
- 羊皮紙を巻く前に:五大神殿を巡りて
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- .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という現代の言葉さえあれば、我々は、これほどまでに多様な神々と、対話することができる。この羊皮紙が、あんたの旅の、良き相棒選びの助けとなることを願う。
おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。
砂漠で見つけた魔法のランプ
- 神々の神殿を巡る旅路・前編 ~Entity Framework Coreで、三柱の神々と契約する~ | 前編の冒険の記録
- SQL Server on Linux with Docker | SQL Serverの召喚に関する、神々の御触書
- Oracle Database on Docker | Oracle XEの召喚に関する、神々の御触書
- DBeaver Community | 神々と対話するための、万能な水晶玉
ラクダの独り言
ご主人が「これで五大神殿を制覇した!」とか言って、やけに得意げになっている。俺に言わせりゃ、どこの神様だろうと、ちゃんと美味い草と、冷たい水を授けてくれる神様が、一番偉い神様なんだがな。まったく、人間ってのは、すぐに序列をつけたがるもんだ。やれやれだぜ。