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

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

``psql`` コマンドは既にインストールおよび構成されています。 ``host-1``
コンテナにログインして、クラスター内でコマンドを実行します。

.. code:: bash

   docker compose exec host-1 bash

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

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

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

1. クラスター内の書き込みリーダーノードに接続します。

.. code:: bash

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

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

.. code:: bash

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

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

1. クラスター内のどのノードに接続しているかを確認します。

.. code:: sql

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

1. ``psql`` を終了し、別の設定で再接続します。

.. code:: bash

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

1. クラスター内の\ ``node-1`` ノードに接続していることを確認します。

.. code:: sql

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

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      |

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

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

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

1. テーブルを作成し、データを挿入します。

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

1. データを照会します。

.. code:: sql

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

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

クラスター全体でのデータの複製
------------------------------

PGDで重要なのは、これらのSQLコマンドがクラスター全体でレプリケートされることです。
PGDは、レプリケーションを行います。たとえば、その\ ``serial``
キーはクラスター全体でグローバル一意のキーに自動的に変換されるため、クラスター内の任意のノードにデータを挿入できます。それは競合や重複なしで他のすべてのノードにレプリケートされます。

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

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

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