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