はじめに

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

PostgreSQL、またはPostgresは、SQLクエリ言語の実装を提供するリレーショナルデータベース管理システムです。標準に準拠し、信頼できるトランザクションや読み取りロックなしの同時実行性など、多くの高度な機能を備えています。

このガイドは、Ubuntu 20.04サーバーにPostgresをインストールする方法を示します。また、一般的なデータベース管理のいくつかの指示も提供します。

前提条件

postgresql illustration for: 前提条件

このチュートリアルを実行するには、ガイドUbuntu 20.04の初期サーバーのセットアップに従って設定したUbuntu 20.04サーバー1台が必要です。この前提条件となるチュートリアルを完了すると、サーバーにはsudo権限と基本的なファイアウォールを備えたroot以外のユーザーがあるはずです。

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

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

最近、そのように行っていない場合は、サーバーのローカルパッケージインデックスを更新します。

				
					
sudo apt update

				
			

その後、追加のユーティリティと機能をいくつか追加する-contribパッケージとともにPostgresパッケージをインストールします。

				
					
sudo apt install postgresql postgresql-contrib

				
			

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

ステップ2 — PostgreSQLのロールとデータベースの使用

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

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

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

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

postgresアカウントへの切り替え

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

				
					
sudo -i -u postgres

				
			

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

				
					
psql

				
			

そこから、必要に応じて、データベース管理システムと自由にやり取りできます。

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

				
					
\q

				
			

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

アカウントの切り替えなしでPostgresプロンプトへアクセスする

また、postgresアカウントで、必要なコマンドをsudoで直接実行することもできます。

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

				
					
sudo -u postgres psql

				
			

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

ここでも、次のように入力して、Postgresの対話型セッションを終了できます。

				
					
\q

				
			

多くのユースケースでは、複数のPostgresロールが必要です。これらの設定方法を学ぶために、続けてお読みください。

ステップ3 — 新しいロールの作成

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

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

				
					
createuser --interactive

				
			

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

				
					
sudo -u postgres createuser --interactive

				
			

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

				
					
[secondary_label Output]

Enter name of role to add: <^>sammy<^>

Shall the new role be a superuser? (y/n) <^>y<^>

				
			

追加のフラグを渡すことにより、より多くの制御ができます。manページを見て、オプションを確認してください。

				
					
man createuser

				
			

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

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

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

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

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

				
					
createdb <^>sammy<^>

				
			

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

				
					
sudo -u postgres createdb <^>sammy<^>

				
			

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

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

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

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

				
					
sudo adduser <^>sammy<^>

				
			

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

				
					
sudo -i -u <^>sammy<^>

psql

				
			

また、インラインでも接続できます:

				
					
sudo -u <^>sammy<^> psql

				
			

このコマンドは、すべてのコンポーネントが正しく設定されていると見なして自動ログインします。

ユーザーを別のデータベースに接続させたい場合は、次のようにデータベースを指定することで可能です。

				
					
psql -d <^>postgres<^>

				
			

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

				
					
\conninfo

				
			
				
					
[secondary_label 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でテーブルを作成して管理する方法について詳しくは、こちらをご覧ください。

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

				
					
CREATE TABLE playground (

    equip_id serial PRIMARY KEY,

    type varchar (50) NOT NULL,

    color varchar (25) NOT NULL,

    location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),

    install_date date

);

				
			

このコマンドは、遊び場のインベントリを作成するテーブルを作成します。テーブルの1つ目の列には、自動インクリメント整数であるシリアルタイプの機器ID番号が保持されます。この列にはPRIMARYKEYの制約もあります。つまり、この列内の値は一意であり、nullであってはなりません。

次の2行は、それぞれ機器タイプ色の列を作成しますが、どちらも空にすることはできません。これらの後の行は、場所の列と、値が8つの可能な値の1つである必要がある制約を作成します。最後の行は、機器を設置した日付を記録する日付列を作成します。

2つの列(equip_idinstall_date)の場合、コマンドはフィールド長を指定しません。これは、長さやフォーマットが暗黙的に示されているため、一部のデータ型では設定された長さが必要ないためです。

次のように入力すると、新しいテーブルが表示されます。

				
					
\d

				
			
				
					
[secondary_label Output]

                  List of relations

 Schema |          Name           |   Type   | Owner

--------+-------------------------+----------+-------

 public | playground              | table    | <^>sammy<^>

 public | playground_equip_id_seq | sequence | <^>sammy<^>

(2 rows)

				
			

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

シーケンスなしでテーブルだけを表示したい場合は、次のよう入力します。

				
					
\dt

				
			
				
					
[secondary_label Output]

          List of relations

 Schema |    Name    | Type  | Owner

--------+------------+-------+-------

 public | playground | table | <^>sammy<^>

(1 row)

				
			

テーブルの準備ができたら、それを使用してデータの管理を練習しましょう。

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

これでテーブルができたので、そこにデータを挿入できます。例として、追加したいテーブルを呼び出し、列に名前を付けてから、次のように各列のデータを提供することにより、すべり台とブランコを追加します。

				
					
INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');

INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');

				
			

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

さらに気をつける点として、equip_id列に値を入力しないことです。これは、テーブルに新しい行を追加するたびに自動的に生成されるためです。

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

				
					
SELECT * FROM playground;

				
			
				
					
[secondary_label 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が正常に入力され、他のすべてのデータが正しく整理されていることがわかります。

遊び場のすべり台が壊れたので取り除く場合は、次のように入力してテーブルから行を削除することもできます。

				
					
DELETE FROM playground WHERE type = 'slide';

				
			

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

				
					
SELECT * FROM playground;

				
			
				
					
[secondary_label Output]

 equip_id | type  | color  | location  | install_date

----------+-------+--------+-----------+--------------

        2 | swing | yellow | northwest | 2018-08-16

(1 row)

				
			

すべり台の行がテーブルにはもうありません。‏

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

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

				
					
ALTER TABLE playground ADD last_maint date;

				
			

テーブル情報をもう一度表示すると、新しい列が追加されているが、データが入力されていないことがわかります。

				
					
SELECT * FROM playground;

				
			
				
					
[secondary_label Output]

 equip_id | type  | color  | location  | install_date | last_maint

----------+-------+--------+-----------+--------------+------------

        2 | swing | yellow | northwest | 2018-08-16   |

(1 row)

				
			

作業員が別のツールを使用してメンテナンス履歴を追跡していることがわかれば、次のように入力して列を削除できます。

				
					
ALTER TABLE playground DROP last_maint;

				
			

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

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

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

必要なレコードをクエリし、列を使用する値に設定することで、既存のエントリの値を更新できます。ブランコの記録をクエリして(これはテーブル内の*すべての*ブランコに一致します)、その色をに変更できます。これは、ブランコセットにペイントジョブを与えた場合に便利です。

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

				
			

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

				
					
SELECT * FROM playground;

				
			
				
					
[secondary_label Output]

 equip_id | type  | color | location  | install_date

----------+-------+-------+-----------+--------------

        2 | swing | red   | northwest | 2018-08-16

(1 row)

				
			

ご覧のとおり、スライドは赤として登録されています。

まとめ

これで、Ubuntu 20.04サーバーでPostgreSQLがセットアップされました。Postgresやその使用方法の詳細については、次のガイドを参照してください。