Docker でのアプリケーションの実行、パート 2: PostgreSQL でのテーブル結合
Tom demos テーブルの結合、反復タスク用のシェル スクリプト、ホスト システムからコンテナー内でコマンドを実行するための「exec」の使用。
Docker でのアプリケーションの実行に関する以前の記事では、PostgreSQL データベースをデプロイし、さまざまなアプリケーションを実行しました。 psql その実行可能性を示すコマンド。 Linux を実行しているローカル x64 システム上の Docker にデータベースをデプロイしましたが、同じコマンドを使用してクラウドまたはエッジにイメージをデプロイすることもできました。 これはテストに適しているだけでなく、独自のアプリケーションとコードを使用して独自の Docker イメージを作成し、必要なときに必要な場所にデプロイすることもできます。
今後の記事では、複数の Docker インスタンスを接続して連携させる方法を紹介します。 ただし、その方法を説明する前に、この記事でさらにいくつかの PostgreSQL 機能について説明します。
テーブル結合
これまでのところ、PostgreSQL クエリは 1 つのテーブルにしかアクセスしていません。 これは限られた数のユース ケースでは問題ありませんが、複数のテーブルのデータを結合または結合できる場合、データベースは特に強力です。 理論的には、オブジェクトに関するすべてのデータを 1 つのテーブルに格納できますが、これが必ずしも効果的であるとは限りません。 たとえば、図書館では、本と借り手に関する情報を同じテーブルに格納できます。 ただし、この方法では、重複した情報で多くのストレージ スペースが浪費されるだけでなく、借り手の個人情報が変更されるたびにデータの行を更新する必要があるため、コンピューティング リソースも浪費されます。
データベースの基本的な目的は、一意の情報を 1 つのテーブルに格納することです。 そのため、上の表は 2 つの異なる表に分けることができます。1 つは書籍情報、もう 1 つは図書館利用者の個人情報です。
鋭い観察者は、借用者の一意の識別子 (借用者 UID) が両方のテーブルに表示されることに気付くでしょう。 この列のデータを使用することで、テーブルを結合して、ブック テーブルのデータ行が表示されるたびに、個人情報テーブルの情報と結合することができます。 SQL 用語では、これを「結合」と呼びます。 この例で使用した大幅な単純化について、すべてのデータベースの専門家に謝る必要があります。
テーブル結合の例
結合を示すために、一連のコンピューター (デバイス) 上のアプリケーションを含む前回の記事で作成したテーブル (アプリ) と、それらのデバイスに関する追加情報を組み合わせる方法を示します。
デバイス情報は CSV ファイル (/tmp/DeviceNames.csv) ホスト マシンで次のコマンドを入力して、Docker を実行しているホスト マシンから PostgreSQL インスタンスにコピーしたもの:
docker cp /tmp/DeviceNames.csv postgresql01:/tmp/hw_devices.csv
この CSV ファイルには、次のデータ列が含まれていました。 _device_id、アーキテクチャ、device_name、名前、 と バージョン.
次に、PostgreSQL インスタンスにログインし、psql を起動して、データベースに接続しました (アプリデータ)、新しいテーブルを作成しました (hw_devices)、次のように入力して CSV データをコピーしました。
docker exec -it postgresql01 bash psql -U PostUser01 c CREATE TABLE hw_devices("_device_id" VARCHAR(40),"architecture" VARCHAR(40),"device_name" VARCHAR(40),"name" VARCHAR(120),"version" VARCHAR(120)); COPY hw_devices FROM '/tmp/hw_devices.csv' DELIMITER ',' CSV HEADER;
アプリケーションを含むテーブルの列を表示しました (アプリ05) およびハードウェア情報を含む表 (hw_devices) 次のように入力します。
d apps05 d hw_devices
次のように入力して、デバイスに関する情報とアプリケーションに関する情報を結合しました。
SELECT * FROM apps05 JOIN hw_devices ON apps05._device_id = hw_devices._device_id;
結合に使用したい列の前にどのように付けたかに注意してください (_デバイスID) 選択したいテーブルと一緒に。
クエリを簡素化するために、テーブルにエイリアスを付けました (うわー と アプリ)、次のように入力して、表示する特定の列のみを選択します。
SELECT hw.device_name, hw. Architecture, app.name, app.version FROM apps05 app JOIN hw_devices hw ON app._device_id = hw._device_id;
結合の出力の一部を下のスクリーンショットに示します。
SQL ステートメントは、アプリケーションをデバイス アーキテクチャ、次にデバイス ID で並べ替えました。
SELECT hw.device_name, hw.version, hw.Architecture, app.name, app.version FROM apps05 app JOIN hw_devices hw ON app._device_id = hw._device_id ORDER BY hw._device_id, hw.architecture;
PostgreSQL を使用したシェル スクリプト
コマンド ラインから psql を直接入力して使用し、コマンドを実行して PostgreSQL データベース、テーブル、およびデータを操作しています。 ただし、PostgreSQL には、プログラミング言語が PostgreSQL と対話できるさまざまな方法があり、シェルの「here」機能を使用して bash シェル スクリプトを使用できます。 here 機能を使用するには、実行するコマンドを「<<」と一意の識別子 (通常は EOF) でマークします。識別子が再び検出されるまで、これらのコマンドが実行されます。
以下のスクリプトは、記事の前半のアクションを実行し、CSV ファイルの最初の 5 行を表示します。 このスクリプトでは、変数の使用方法も示します (データベース名 と ユーザー名) シェルスクリプトで。
#!/bin/bash dbname="appsdata" username="PostUser01" psql $dbname $username << EOF d apps05 d hw_devices COPY (SELECT hw.device_name, hw.version, hw.Architecture, app.name, app.version FROM apps05 app JOIN hw_devices hw ON app._device_id = hw._device_id ORDER BY hw._device_id, hw.architecture) to '/tmp/Apps_by_Device.txt' with csv; q EOF ls -l /tmp/Apps_by_Device.txt head -5 /tmp/Apps_by_Device.txt
注: PostgreSQL Docker イメージにはエディターが付属していないため、次のように入力してイメージにエディター (vim) をインストールする必要がありました。
apt-get update apt-get install vim
スクリプトを作成しました(PostQuery01.sh) 実行可能ファイルを作成し、次のように入力して実行しました。
chmod 755 PostQuery01.s ./PostQuery01.sh
Docker コンテナでの非対話型コマンドの実行
これまでのところ、すべてのコマンドを Docker コンテナー内から対話的に実行しましたが、ホスト システムから非対話的に実行することもできます。 エグゼクティブ 指図。
たとえば、に含まれるファイルを一覧表示するには、 /tmp のディレクトリ postslq01 コンテナ、私は入力しました:
docker exec postgresql01 ls -l /tmp
上記のホストからスクリプトを実行するために、次のように入力しました。
docker exec postgresql01 /PostQuery01.sh
.