序章

リレーショナルデータベース管理システムは、多くのWebサイトやアプリケーションの重要なコンポーネントです。 これらは、情報を保存、整理、およびアクセスするための構造化された方法を提供します。

PostgreSQL 、またはPostgresは、SQLクエリ言語の実装を提供するリレーショナルデータベース管理システムです。 これは、多くの小規模および大規模プロジェクトで人気のある選択肢であり、標準に準拠し、信頼性の高いトランザクションや読み取りロックのない同時実行性などの多くの高度な機能を備えているという利点があります。

このガイドでは、Ubuntu 18.04 VPSインスタンスにPostgresをインストールする方法を示し、基本的なデータベース管理の手順も示します。

前提条件

このチュートリアルに従うには、 Ubuntu18.04の初期サーバーセットアップガイドに従って構成された1つのUbuntu18.04サーバーが必要です。 この前提条件のチュートリアルを完了すると、サーバーには、sudo権限と基本的なファイアウォールを持つ非rootユーザーが必要になります。

このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルでPostgreSQLのインストールと構成を試すこともできます。 次のLaunch an Interactive Terminal!ボタンをクリックして開始します。

ステップ1—PostgreSQLのインストール

UbuntuのデフォルトリポジトリにはPostgresパッケージが含まれているため、aptパッケージシステムを使用してこれらをインストールできます。

このセッションでaptを使用するのはこれが初めてなので、ローカルパッケージインデックスを更新します。 次に、いくつかの追加のユーティリティと機能を追加する-contribパッケージと一緒にPostgresパッケージをインストールします。

  1. sudo apt update
  2. sudo apt install postgresql postgresql-contrib

systemctl startコマンドを使用して、サーバーが実行されていることを確認します。

  1. sudo systemctl start postgresql.service

ソフトウェアがインストールされて実行されたので、それがどのように機能するか、そしてそれがあなたが使用したかもしれない同様のデータベース管理システムとどのように異なるかを調べることができます。

ステップ2—PostgreSQLの役割とデータベースを使用する

デフォルトでは、Postgresはrolesと呼ばれる概念を使用して認証と承認を処理します。 これらは、いくつかの点で通常のUnixスタイルのアカウントに似ていますが、Postgresはユーザーとグループを区別せず、代わりに、より柔軟な用語「ロール」を好みます。

インストール時に、Postgresは ident 認証を使用するように設定されます。つまり、Postgresの役割を一致するUnix/Linuxシステムアカウントに関連付けます。 Postgres内にロールが存在する場合、同じ名前のUnix/Linuxユーザー名がそのロールとしてサインインできます。

インストール手順により、デフォルトのPostgresロールに関連付けられたpostgresというユーザーアカウントが作成されました。 Postgresを使用するには、そのアカウントにログインできます。

このアカウントを使用してPostgresにアクセスする方法はいくつかあります。

postgresアカウントに切り替えます

次のように入力して、サーバーのpostgresアカウントに切り替えます。

  1. sudo -i -u postgres

次のように入力すると、Postgresプロンプトにすぐにアクセスできます。

  1. psql

これによりPostgreSQLプロンプトにログインし、ここからデータベース管理システムをすぐに自由に操作できます。

次のように入力して、PostgreSQLプロンプトを終了します。

  1. \q

これにより、postgresLinuxコマンドプロンプトに戻ります。

アカウントを切り替えずにPostgresプロンプトにアクセスする

最後の例では、最初に postgres ユーザーに切り替え、次にpsqlを実行してPostgresプロンプトを開くことにより、Postgresプロンプトを表示するように指示されました。 または、次のように、sudoを使用してpostgresユーザーとして単一のコマンドpsqlを実行することにより、これを1つのステップで実行できます。

  1. sudo -u postgres psql

これにより、中間のbashシェルを介さずに、Postgresに直接ログインできます。

ここでも、次のように入力して、インタラクティブなPostgresセッションを終了できます。

  1. \q

多くのユースケースでは、複数のPostgresロールが必要です。 これらを構成する方法を学ぶために読んでください。

ステップ3—新しい役割を作成する

現在、データベース内でpostgresロールが構成されているだけです。 createroleコマンドを使用して、コマンドラインから新しい役割を作成できます。 --interactiveフラグは、新しい役割の名前の入力を求め、スーパーユーザー権限が必要かどうかも尋ねます。

postgres アカウントとしてログインしている場合は、次のように入力して新しいユーザーを作成できます。

  1. createuser --interactive

代わりに、通常のアカウントから切り替えずに各コマンドにsudoを使用する場合は、次のように入力します。

  1. sudo -u postgres createuser --interactive

スクリプトはいくつかの選択肢を表示し、応答に基づいて正しいPostgresコマンドを実行して、仕様を満たすユーザーを作成します。

まず、プロンプトで新しい役割の名前を指定するように求められます。 次の例では、ロールに sammy という名前を付けていますが、好きな名前を付けることができます。

Output
Enter name of role to add: sammy

次に、新しい役割をスーパーユーザーにするかどうかを尋ねられます。 PostgreSQLでは、スーパーユーザーの役割には非常に幅広い特権があり、ほとんどすべての権限チェックをバイパスできます。

次の例では、 sammy ロールをスーパーユーザーにする必要があることを指定していますが、スーパーユーザーロールにはデータベースに対する大きな権限と制御があるため、新しいロールにスーパーユーザーステータスを軽く付与しないでください。

Output
Enter name of role to add: sammy Shall the new role be a superuser? (y/n) y

新しいスーパーユーザーロールを作成できるのは、すでにスーパーユーザーであるロールとして作成する場合のみであることに注意してください。 デフォルトでは、postgresロールはスーパーユーザーです。

いくつかの追加のフラグを渡すことで、より詳細な制御を取得できます。 manページを見て、オプションを確認してください。

  1. man createuser

Postgresのインストールに新しい役割が追加されましたが、データベースはまだ追加されていません。 次のセクションでは、このプロセスについて説明します。

ステップ4—新しいデータベースの作成

Postgres認証システムがデフォルトで行うもう1つの前提は、ログインに使用されるロールの場合、そのロールにはアクセスできる同じ名前のデータベースがあるということです。

これは、前のセクションで作成したユーザーが sammy と呼ばれる場合、そのロールはデフォルトで「sammy」とも呼ばれるデータベースへの接続を試みることを意味します。 createdbコマンドを使用して、適切なデータベースを作成できます。

postgres アカウントとしてログインしている場合は、次のように入力します。

  1. createdb sammy

代わりに、通常のアカウントから切り替えずに各コマンドにsudoを使用する場合は、次のように入力します。

  1. sudo -u postgres createdb sammy

この柔軟性により、必要に応じてデータベースを作成するための複数のパスが提供されます。

ステップ5—新しい役割でPostgresプロンプトを開く

identベースの認証でログインするには、Postgresの役割およびデータベースと同じ名前のLinuxユーザーが必要です。

一致するLinuxユーザーが利用できない場合は、adduserコマンドを使用して作成できます。 これは、sudo権限を持つroot 以外のアカウントから行う必要があります(つまり、 postgres ユーザーとしてログインしていません)。

  1. sudo adduser sammy

この新しいアカウントが利用可能になったら、次のように入力して、切り替えてデータベースに接続できます。

  1. sudo -i -u sammy
  2. psql

または、これをインラインで実行できます。

  1. sudo -u sammy psql

このコマンドは、すべてのコンポーネントが適切に構成されていることを前提として、自動的にログインします。

ユーザーが別のデータベースに接続するようにする場合は、次のようにデータベースを指定することで接続できます。

  1. psql -d postgres

ログインすると、次のように入力して現在の接続情報を確認できます。

  1. \conninfo
Output
You are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".

これは、デフォルト以外のデータベースまたはデフォルト以外のユーザーに接続している場合に役立ちます。

ステップ6—テーブルの作成と削除

PostgreSQLデータベースシステムに接続する方法がわかったので、いくつかの基本的なPostgres管理タスクを学ぶことができます。

まず、いくつかのデータを格納するためのテーブルを作成します。 例として、いくつかの遊具を説明する表。

このコマンドの基本的な構文は次のとおりです。

CREATE TABLE table_name (
    column_name1 col_type (field_length) column_constraints,
    column_name2 col_type (field_length),
    column_name3 col_type (field_length)
);

これらのコマンドは、テーブルに名前を付けてから、列、列タイプ、およびフィールドデータの最大長を定義します。 オプションで、各列にテーブル制約を追加することもできます。

Postgres でテーブルを作成および管理する方法について詳しくは、こちらをご覧ください。

デモンストレーションの目的で、次のようなサンプルテーブルを作成します。

  1. CREATE TABLE playground (
  2. equip_id serial PRIMARY KEY,
  3. type varchar (50) NOT NULL,
  4. color varchar (25) NOT NULL,
  5. location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
  6. install_date date
  7. );

これらのコマンドは、遊具をインベントリするテーブルを作成します。 これは、serialタイプの機器IDから始まります。 このデータ型は自動インクリメント整数です。 また、この列にprimary keyの制約を指定しました。これは、値がnullではなく一意である必要があることを意味します。

2つの列(equip_idおよびinstall_date)の場合、コマンドはフィールド長を指定しません。 これは、長さがタイプによって暗示されるため、一部の列タイプは設定された長さを必要としないためです。

次の2つのコマンドは、機器typeおよびcolorの列をそれぞれ作成します。これらの列は、それぞれ空にすることはできません(それぞれに適用されるNOT NULL制約で指定)。 これらの後の行は、location列を作成し、この列の値が8つの可能な値の1つであることを要求する制約を追加します。 括弧内の最後の行は、機器を設置した日付を記録するdate列を作成します。

SQLでは、すべてのステートメントはセミコロン(;)で終了する必要があることに注意してください。

CREATE TABLE操作を正しく入力すると、次の出力が返されます。

Output
CREATE TABLE

次のように入力すると、このデータベース内のテーブルのリストを見つけることができます。

  1. \d
Output
List of relations Schema | Name | Type | Owner --------+-------------------------+----------+------- public | playground | table | sammy public | playground_equip_id_seq | sequence | sammy (2 rows)

あなたの遊び場のテーブルはここにありますが、タイプsequenceplayground_equip_id_seqと呼ばれるものもあります。 これは、equip_id列に指定したserialタイプを表したものです。 これにより、シーケンス内の次の番号が追跡され、このタイプの列に対して自動的に作成されます。

シーケンスなしでテーブルのみを返したい場合は、次のように入力できます。

  1. \dt
Output
List of relations Schema | Name | Type | Owner --------+------------+-------+------- public | playground | table | sammy (1 row)

ステップ7—テーブル内のデータの追加、クエリ、および削除

これでテーブルができたので、そこにデータを挿入できます。

例として、追加するテーブルを呼び出し、列に名前を付けてから、次のように各列のデータを提供することにより、スライドとスイングを追加します。

  1. INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
  2. INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');

いくつかの一般的なハングアップを回避するために、データを入力するときに注意する必要があります。 たとえば、列名を引用符で囲まないでください。ただし、入力する列の値には引用符が必要です。

もう1つ覚えておくべきことは、equip_id列に値を入力しないことです。 これは、テーブルに新しい行が作成されるたびにこれが自動的に生成されるためです。

次のように入力して、追加した情報を取得します。

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 1 | slide | blue | south | 2017-04-28 2 | swing | yellow | northwest | 2018-08-16 (2 rows)

この出力は、equip_idが正常に入力され、他のすべてのデータが正しく整理されていることを示しています。

遊び場のスライドが壊れて削除する必要がある場合は、次のように入力してテーブルから行を削除することもできます。

  1. DELETE FROM playground WHERE type = 'slide';

テーブルを再度クエリします。

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 2 | swing | yellow | northwest | 2018-08-16 (1 row)

スライドがテーブルの一部ではなくなったことに注意してください。

ステップ8—テーブルへの列の追加と削除

テーブルを作成した後、比較的簡単に列を追加または削除するようにテーブルを変更できます。 次のように入力して、各機器の最後のメンテナンス訪問を示す列を追加します。

  1. ALTER TABLE playground ADD last_maint date;

次にテーブル情報を再度表示すると、新しい列が追加されます(ただし、データは入力されません)。

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date | last_maint ----------+-------+--------+-----------+--------------+------------ 2 | swing | yellow | northwest | 2018-08-16 | (1 row)

列を削除するには、last_maint列を追加するために使用したものと非常によく似たSQLステートメントを入力できます。 作業員が別のツールを使用してメンテナンス履歴を追跡していることがわかった場合は、次のように入力して列を削除できます。

  1. ALTER TABLE playground DROP last_maint;

これにより、last_maint列とその中にあるすべての値が削除されますが、他のすべてのデータはそのまま残ります。

ステップ9—テーブルのデータを更新する

これまで、テーブルにレコードを追加する方法とレコードを削除する方法を学習しましたが、このチュートリアルでは、既存のエントリを変更する方法についてはまだ説明していません。

必要なレコードを照会し、列を使用する値に設定することにより、既存のエントリの値を更新できます。 「スイング」レコードを照会して(これは、テーブル内のすべてのスイングに一致します)、その色を「赤」に変更できます。 これは、スイングセットにペイントジョブを与えた場合に役立ちます。

  1. UPDATE playground SET color = 'red' WHERE type = 'swing';

データを再度クエリすることで、操作が成功したことを確認できます。

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date ----------+-------+-------+-----------+-------------- 2 | swing | red | northwest | 2010-08-16 (1 row)

この出力が示すように、スライドは赤として登録されています。

結論

これで、Ubuntu18.04サーバーでPostgreSQLがセットアップされました。 ただし、Postgresで学ぶべきことはまだはるかにあります。 Postgresの使用方法をカバーするその他のガイドは次のとおりです。