前書き
リレーショナルデータベース管理システムは、多くのWebサイトおよびアプリケーションの重要なコンポーネントです。 これらは、情報を保存、整理、およびアクセスするための構造化された方法を提供します。
PostgreSQL、またはPostgresは、SQLクエリ言語の実装を提供するリレーショナルデータベース管理システムです。 多くの小規模および大規模プロジェクトで人気のある選択肢であり、標準に準拠し、信頼できるトランザクションや読み取りロックなしの同時実行性などの多くの高度な機能を備えているという利点があります。
このガイドは、Ubuntu 18.04 VPSインスタンスにPostgresをインストールする方法を示し、基本的なデータベース管理の手順も提供します。
前提条件
このチュートリアルに従うには、Initial Server Setup for Ubuntu 18.04ガイドに従って構成された1つのUbuntu18.04サーバーが必要です。 この前提条件のチュートリアルを完了すると、サーバーには、sudo権限と基本的なファイアウォールを持つroot以外のユーザーが必要になります。
[[step-1 -—- installing-postgresql]] ==ステップ1—PostgreSQLのインストール
UbuntuのデフォルトリポジトリにはPostgresパッケージが含まれているため、apt
パッケージシステムを使用してこれらをインストールできます。
このセッションでapt
を使用するのはこれが初めてなので、ローカルパッケージインデックスを更新します。 次に、いくつかの追加のユーティリティと機能を追加する-contrib
パッケージと一緒にPostgresパッケージをインストールします。
sudo apt update
sudo apt install postgresql postgresql-contrib
これでソフトウェアがインストールされたので、それがどのように機能し、使用した可能性のある類似のデータベース管理システムとどのように異なるかを検討することができます。
[[step-2 -—- using-postgresql-roles-and-databases]] ==ステップ2—PostgreSQLのロールとデータベースの使用
デフォルトでは、Postgresは「ロール」と呼ばれる概念を使用して認証と承認を処理します。 これらはいくつかの点で通常のUnixスタイルのアカウントに似ていますが、Postgresはユーザーとグループを区別せず、代わりに「ロール」というより柔軟な用語を好みます。
インストール時に、Postgresはident認証を使用するように設定されます。つまり、Postgresの役割を一致するUnix / Linuxシステムアカウントに関連付けます。 Postgres内にロールが存在する場合、同じ名前のUnix / Linuxユーザー名はそのロールとしてサインインできます。
インストール手順により、デフォルトのPostgresロールに関連付けられたpostgresというユーザーアカウントが作成されました。 Postgresを使用するには、そのアカウントにログインできます。
このアカウントを使用してPostgresにアクセスする方法はいくつかあります。
postgresアカウントへの切り替え
次のように入力して、サーバーのpostgresアカウントに切り替えます。
sudo -i -u postgres
次のように入力して、すぐにPostgresプロンプトにアクセスできます。
psql
これにより、PostgreSQLプロンプトにログインし、ここからデータベース管理システムとすぐにやり取りできます。
次のように入力して、PostgreSQLプロンプトを終了します。
\q
これにより、postgres
Linuxコマンドプロンプトに戻ります。
アカウントを切り替えずにPostgresプロンプトにアクセスする
sudo
を使用して、postgresアカウントで必要なコマンドを直接実行することもできます。
たとえば、最後の例では、最初にpostgresユーザーに切り替え、次にpsql
を実行してPostgresプロンプトを開くことにより、Postgresプロンプトにアクセスするように指示されました。 次のように、sudo
を使用してpostgresユーザーとして単一のコマンドpsql
を実行することにより、これを1つのステップで実行できます。
sudo -u postgres psql
これにより、中間のbash
シェルを介さずに、Postgresに直接ログインできます。
繰り返しますが、次のように入力して、インタラクティブなPostgresセッションを終了できます。
\q
多くのユースケースでは、複数のPostgresロールが必要です。 これらを設定する方法を学ぶために読んでください。
[[step-3 -—- creating-a-new-role]] ==ステップ3—新しい役割の作成
現在、データベース内で構成されているpostgresロールがあります。 createrole
コマンドを使用して、コマンドラインから新しい役割を作成できます。 --interactive
フラグは、新しいロールの名前の入力を求め、スーパーユーザー権限が必要かどうかも尋ねます。
postgresアカウントとしてログインしている場合は、次のように入力して新しいユーザーを作成できます。
createuser --interactive
代わりに、通常のアカウントから切り替えずに各コマンドにsudo
を使用する場合は、次のように入力します。
sudo -u postgres createuser --interactive
スクリプトはいくつかの選択を促し、応答に基づいて正しいPostgresコマンドを実行し、仕様に合ったユーザーを作成します。
OutputEnter name of role to add: sammy
Shall the new role be a superuser? (y/n) y
いくつかの追加フラグを渡すことで、より多くの制御を取得できます。 man
ページを見て、オプションを確認してください。
man createuser
Postgresのインストールに新しいユーザーが追加されましたが、まだデータベースを追加していません。 次のセクションでは、このプロセスについて説明します。
[[step-4 -—- creating-a-new-database]] ==ステップ4—新しいデータベースの作成
Postgres認証システムがデフォルトで行うもう1つの仮定は、ログインに使用されるすべてのロールについて、そのロールにはアクセス可能な同じ名前のデータベースがあることです。
これは、前のセクションで作成したユーザーがsammyと呼ばれる場合、そのロールはデフォルトで「sammy」とも呼ばれるデータベースへの接続を試みることを意味します。 createdb
コマンドを使用して適切なデータベースを作成できます。
postgresアカウントとしてログインしている場合は、次のように入力します。
createdb sammy
代わりに、通常のアカウントから切り替えずに各コマンドにsudo
を使用する場合は、次のように入力します。
sudo -u postgres createdb sammy
この柔軟性により、必要に応じてデータベースを作成するための複数のパスが提供されます。
[[step-5 --- opening-a-postgres-prompt-with-the-new-role]] ==ステップ5—新しい役割でPostgresプロンプトを開く
ident
ベースの認証でログインするには、Postgresの役割およびデータベースと同じ名前のLinuxユーザーが必要です。
一致するLinuxユーザーが利用できない場合は、adduser
コマンドを使用して作成できます。 これは、sudo
権限を持つroot以外のアカウントから行う必要があります(つまり、postgresユーザーとしてログインしていません)。
sudo adduser sammy
この新しいアカウントが使用可能になったら、次のように入力してデータベースに切り替えて接続できます。
sudo -i -u sammy
psql
または、このインラインで行うことができます:
sudo -u sammy psql
このコマンドは、すべてのコンポーネントが適切に構成されていると仮定して、自動的にログインします。
ユーザーが別のデータベースに接続するようにしたい場合は、次のようにデータベースを指定して接続できます。
psql -d postgres
ログインすると、次のように入力して現在の接続情報を確認できます。
\conninfo
OutputYou are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".
これは、デフォルト以外のデータベースまたはデフォルト以外のユーザーに接続する場合に役立ちます。
[[ステップ-6 ---テーブルの作成と削除]] ==ステップ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)
);
ご覧のとおり、これらのコマンドはテーブルに名前を付けてから、フィールドデータの列タイプと最大長とともに列を定義します。 オプションで、各列にテーブル制約を追加することもできます。
how to create and manage tables in 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
);
これらのコマンドは、遊具のインベントリを作成するテーブルを作成します。 これは、serial
タイプの機器IDで始まります。 このデータ型は自動インクリメント整数です。 また、この列にprimary key
の制約を指定しました。これは、値が一意であり、nullではないことを意味します。
2つの列(equip_id
とinstall_date
)の場合、コマンドはフィールド長を指定しません。 これは、一部の列タイプでは長さがタイプによって暗示されているため、長さを設定する必要がないためです。
次の2つのコマンドは、機器type
とcolor
の列をそれぞれ作成しますが、それぞれを空にすることはできません。 これらの後のコマンドは、location
列を作成し、値が8つの可能な値の1つである必要がある制約を作成します。 最後のコマンドは、機器を設置した日付を記録する日付列を作成します。
次のように入力して、新しいテーブルを表示できます。
\d
Output List of relations
Schema | Name | Type | Owner
--------+-------------------------+----------+-------
public | playground | table | sammy
public | playground_equip_id_seq | sequence | sammy
(2 rows)
遊び場のテーブルはここにありますが、sequence
タイプのplayground_equip_id_seq
と呼ばれるものもあります。 これは、equip_id
列に指定したserial
タイプの表現です。 これは、シーケンス内の次の番号を追跡し、このタイプの列に対して自動的に作成されます。
シーケンスなしでテーブルのみを表示する場合は、次のように入力できます。
\dt
Output List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
public | playground | table | sammy
(1 row)
[[step-7 --- add-querying-and-deleting-data-in-a-table]] ==ステップ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');
データを入力するときは、いくつかの一般的なハングアップを避けるように注意する必要があります。 たとえば、列名を引用符で囲まないでください。ただし、入力する列値には引用符が必要です。
覚えておくべきもう1つのことは、equip_id
列に値を入力しないことです。 これは、テーブルに新しい行が作成されるたびに、これが自動的に生成されるためです。
次のように入力して、追加した情報を取得します。
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
が正常に入力され、他のすべてのデータが正しく整理されていることがわかります。
遊び場のスライドが壊れて削除する必要がある場合は、次のように入力してテーブルから行を削除することもできます。
DELETE FROM playground WHERE type = 'slide';
テーブルを再度クエリします。
SELECT * FROM playground;
Output equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
2 | swing | yellow | northwest | 2018-08-16
(1 row)
スライドがテーブルの一部ではなくなったことがわかります。
[[step-8 -—-テーブルから列を追加および削除]] ==ステップ8—テーブルからの列の追加と削除
テーブルを作成したら、列を比較的簡単に追加または削除するように変更できます。 次のように入力して、各機器の最後のメンテナンス訪問を示す列を追加します。
ALTER TABLE playground ADD last_maint date;
テーブル情報を再度表示すると、新しい列が追加されていることがわかります(ただし、データは入力されていません)。
SELECT * FROM playground;
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
列とその中にあるすべての値が削除されますが、他のすべてのデータはそのまま残ります。
[[step-9 -—- updating-data-in-a-table]] ==ステップ9—テーブル内のデータを更新する
これまで、レコードをテーブルに追加する方法と削除する方法を学習しましたが、このチュートリアルでは、既存のエントリを変更する方法についてはまだ説明していません。
既存のエントリの値を更新するには、必要なレコードをクエリし、使用する値に列を設定します。 「swing」レコードをクエリして(これはテーブルのeveryスイングと一致します)、その色を「red」に変更できます。 これは、スイングセットにペイントジョブを与えた場合に便利です。
UPDATE playground SET color = 'red' WHERE type = 'swing';
データを再度クエリすることで、操作が成功したことを確認できます。
SELECT * FROM playground;
Output equip_id | type | color | location | install_date
----------+-------+-------+-----------+--------------
2 | swing | red | northwest | 2010-08-16
(1 row)
ご覧のとおり、スライドは赤で登録されています。
結論
これで、Ubuntu 18.04サーバーでPostgreSQLがセットアップされました。 ただし、Postgresで学ぶべきことはまだmuchあります。 Postgresの使用方法をカバーするガイドがいくつかあります。