Working with SQL and the PGD cluster
====================================

PGDクラスターを使用する最初のステップは、
SQLを使用して接続することです。これは、 ``psql``
コマンドラインインターフェイスまたはPostgreSQLをサポートする他のSQLクライアントを使用して実行できます。

クイックスタートキットのDocker Composeセットアップを使用している場合、
``psql``
コマンドは既にインストールされ構成されています。つまり、ホストの1つでシェルを取得するだけで作業が開始できます。
``host-1``
コンテナにサインインして、クラスター内でコマンドを実行できます。

.. code:: bash

   docker compose exec host-1 bash

これにより、 ``host-1`` コンテナ内にシェルが提供され、
PGDクラスターに対してPGDおよびSQLコマンドを実行できます。

PGDクラスター内の接続
---------------------

PGD
Essentialでは、メンテナンスタスクを実行する場合を除き、通常、クラスター内のすべてのホストのTCPポート6432で実行されている接続マネージャーを使用してクラスターに接続します。

次のコマンドを使用して、クラスター内の書き込みリーダーノードに接続できます。

.. code:: bash

   psql -h <host> -p 6432 -U <username> <database>

ユーザーなしで実行されている新しいクラスターは\ ``postgres``
スーパーユーザーを除き 、1つのレプリケートデータベース\ ``pgddb``
があるため、次のコマンドを使用してクラスターに接続できます。

.. code:: bash

   psql -h host-1 -p 6432 -U postgres pgddb

これは、ポート6432の\ ``host-1``
コンテナで実行されている接続マネージャーに接続し、クラスター内の書き込みリーダーノードにルーティングされます。
``host-1``
は、クラスター内のホストの名前に置き換えることができます。それらはすべて接続マネージャーを実行します。

次のコマンドを実行すると、クラスター内のどのノードに接続しているかを確認できます。

.. code:: sql

   select node_name from bdr.local_node_summary;
   __OUTPUT__
    node_name
   - ----------
    node-1

クラスター内で\ ``node-1`` ノードを実行している\ ``host-1``
コンテナに接続したため、これは驚くべきことではありません。

``psql`` を終了し、次のように再接続すると

.. code:: bash

   psql -h host-2 -p 6432 -U postgres pgddb

クラスター内の\ ``node-1`` ノードに接続していることがわかります。

.. code:: sql

   select node_name from bdr.local_node_summary;
    node_name
   - ----------
    node-1

これは、クラスター内の書き込みリーダーノード\ ``node-1``
にルーティングする接続マネージャーです。これを確認するには、次のことを実行できます。

.. code:: sql

   \! pgd group group-1 show --summary
   __OUTPUT__
    Group Property    | Value
   - ------------------+---------
    Group Name        | group-1
    Parent Group Name | pgd
    Group Type        | data
    Write Leader      | node-1
    Commit Scope      |

``psql`` の\ ``\!`` コマンドを使用して、\ ``psql``
セッション内からシェルコマンドを直接実行できます。

SQLでの作業
-----------

クラスターに接続したので、
SQLコマンドでの作業を開始できます。通常のPostgreSQLデータベースを使用するのと同じように、テーブルを作成し、データを挿入し、クエリを実行できます。

たとえば、テーブルを作成し、いくつかのデータを挿入できます。

.. code:: sql

   CREATE TABLE users (
       id SERIAL PRIMARY KEY,
       name VARCHAR(100),
       email VARCHAR(100) UNIQUE
   );
   INSERT INTO users (name, email) VALUES
   (Alice, alice@example.com),
   (Bob, bob@example.com);

次に、データを照会できます。

.. code:: sql

   SELECT * FROM users;
   __OUTPUT__
    id |  name  |        email
   - ---+--------+---------------------
     2 | Alice  |      alice@example.com
     3 | Bob    |      bob@example.com     
   (2 rows)    

より複雑なクエリーを実行し、テーブルを結合し、PostgreSQLのすべての機能を使用することもできます。すべてのSQLコマンドをカバーすることはこのガイドの範囲内ではありませんが、
SQL構文とコマンドの詳細については、 
`PostgreSQL documentation <https://www.postgresql.org/docs/current/sql.html>`_ を参照してください。

PGDとの違い
-----------

重要なのは、これらのSQLコマンドがクラスター全体でレプリケートされることです。
PGDがレプリケーションを処理します。たとえば、その\ ``serial``
キーはクラスター全体でグローバル一意キーに自動的に変換されているため、クラスター内の任意のノードにデータを挿入でき、それは他のすべてのノードにレプリケートされます。
PGD
Essentialの場合、書き込みリーダーに接続する必要があるため、これはそれほど重要ではありませんが、
PGD
Expandedでは、クラスター内の任意のノードに接続してSQLコマンドを実行できます。この自動変更により、サービスを心配せずにそれを行うことができます。競合または重複。
PGD Essentialを使用すると、将来も対応でき、
SQLコマンドやアプリケーションコードを変更せずに、後で簡単にPGD
Expandedに移行できます。

次のステップ
------------

PGDクラスターに接続し、いくつかのSQLコマンドを実行したため、次のトピックを探索できます。

- :ref:`Loading data into your PGD Cluster <Loading data into your PGD Cluster>`  外部ソースからデータをインポートする方法を学習します。

- :ref:`Using PGD CLI <Using PGD CLI>`  コマンドラインからPGDクラスターを管理します。
