わからないなりに理解したいデータベース④:RDB編:PostgreSQL

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回も前回までで扱った MySQL、MariaDB と同じく、あらかじめ決めておいた要素を持つ多数のデータを保存する RDBMS の一種である、PostgreSQL の基本的な使い方を見ていこうと思います。
時間があれば、前回までの MySQL、MariaDB の記事の内容と比べながら試していただくと少しだけ面白いかもしれません。

■PostgreSQL のインストール

まずはインストール…ですが、OS によってインストール方法は異なりますので、こちらなどからお使いの OS に合わせたインストール方法を確認してください。

なお、今回の例では Red Hat Enterprise Linux 9 を使用しますが、Red Hat Enterprise Linux 9 の場合は以下のコマンドを実行すれば OK です。

$ sudo dnf -y install postgresql-server

■PostgreSQL の起動とログ

次は起動方法ですが、OS やインストール方法などによって異なりますので、先のページなどのインストールを行う際に参照したページを確認してください。

一例として、今回の例の Red Hat Enterprise Linux 9 を使用して、先の手順でインストールした場合は以下の2つのコマンドを実行することで起動できます。

$ sudo /usr/bin/postgresql-setup --initdb
$ sudo systemctl start postgresql

万が一うまくいかない場合は、ログで原因を確認しましょう。
PostgreSQL のログの配置場所は、設定ファイル “postgresql.conf” 内の設定 “log_directory” で指定されたディレクトリ内になります。
デフォルトでは、PostgreSQL の各種データが保存されているディレクトリ内にある “log” ディレクトリに保存される設定になっているはずです。

起動自体に失敗している場合にはシステム側のログに手がかりがある可能性もありますので、落ち着いて各ログを確認するようにしましょう。

■PostgreSQL のデータベース作成

RDB では、まず「一つのテーマに沿ったデータのまとまりの大枠」となる、”データベース” を作成する必要があります。

PostgreSQL では、PostgreSQL に接続する前に以下のようなコマンドで予めデータベースを作成しておく手法が、標準的なものとされています。

$ createdb -U  

このコマンドを実行するには、PostgreSQL のユーザ名/パスワードが必要になります。
PostgreSQL のデフォルトユーザは環境・インストール方法によって異なりますが、今回の例の手順ではパスワードなしの “postgres” というユーザが作成されているはずです。殆どの場合、デフォルトのユーザ名は “postgres” または「PostgreSQL のインストールを行なったユーザ名と同じ」になります。

また、デフォルトの設定では PostgresSQL のユーザ名がシステム側のユーザ名と一致している場合にのみ、PostgreSQL のコマンドは成功します。
この挙動を変更したい場合、”pg_hba.conf” を編集する必要があります。また、pg_hba.conf の設定次第ではこのとおりにならない可能性もあります。

そして、このコマンドにおいて “-U ” を省略した場合、システム側のユーザ名と同じ名前をユーザ名として指定したものとして扱われます。

以上を踏まえると、例えば初期状態から「test」という名前のデータベースを作るならば、以下のようなコマンドになります。

$ sudo -u postgres createdb -E UTF8 test

なお、MySQL などと同じように接続した後に “CREATE DATABASE 文” を使用してデータベースを作成することも可能です。

■PostgreSQL への接続とパスワード変更

PostgreSQL のデータベース操作は、通常 PostgreSQL に接続して行います。
PostgreSQL への接続は以下のコマンドで行います。

$ psql  
Enter password:

先述のとおり、今回の例の手順ではデフォルトでパスワードなしの “postgres” というユーザが作られているはずです。
また、こちらの “psql” コマンドでも、デフォルトではパスワードなしのユーザは PostgresSQL のユーザ名がシステム側のユーザ名と一致している場合にのみにしか使用できず、ユーザ名を省略するとシステム側のユーザ名と同じ名前をユーザ名として指定したものと扱われます。

よって、以下のコマンドで接続できるはずです。

$ sudo -u postgres psql test

以下のように表示されれば、接続成功です。

$ sudo -u postgres psql test
psql (13.7)
Type "help" for help.

test=#

この方法では指定したデータベースを使用する状態で接続されますが、“USE 文” による使用データベースの切り替えも勿論可能です。

パスワードについては、pg_hba.conf” の設定をパスワードによる認証を行うように変更しない限りは使用されることはありませんが、”ALTER USER 文” を使って変更することができます。

例えば、デフォルトの “postgres” ユーザのパスワードを変更するには、以下のコマンドを実行します。

test=# ALTER USER postgres PASSWORD '';

■データベースの基本的な操作

PostgreSQL のデータベースの基本的な使い方も見ていきましょう。

PostgreSQL も RDB であるため、データを入れるためにはどういうデータを入れるかを決めるテーブル” と、そのテーブルを複数で一つの組として管理するための “データベース” が予め必要になります。
今回はデータベースを既に作って接続しているため、テーブルの作成方法から見ていきます。

■テーブルの作成:CREATE TABLE 文

まずは入れるデータについての情報や制限を決めるテーブル” を作成します。

テーブルの作成は、基本的には以下のようなコマンドで行います。

=# CREATE TABLE  (
   ,
   , 
    :
);

今回は…前回と同じように、架空の通販用の商品リストを簡素な形で作ってみます。
テーブル名は “items” で持つ要素はこんな感じにします。

 ・商品ID (itemID):任意の文字 (8文字以内)
 ・商品名 (name):任意の文字 (30文字以内)
 ・メーカーID (ManufacturerID):任意の文字 (4文字以内)
 ・値段 (price):数字

この場合はこのような感じになります。

test=# CREATE TABLE items (
    itemID varchar(8),
    name varchar(30),
    ManufacturerID varchar(4),
    price int
  );
CREATE TABLE
test=#

■データの追加:INSERT 文

続いて、実際にデータをテーブルに入れていきます。
データを入れる場合の基本は、以下のようなコマンドです。

=# INSERT INTO  VALUES (, , …);

先に作ったテーブルで試してみましょう。

test=# INSERT INTO items VALUES ('00000001', '電子レンジ', '0001', 9000);
INSERT 0 1

なお、”VALUES” の後ろの実際に入れるデータの部分は、”()” を “,” で区切ることで複数のデータを同時に入れることができます。

test=# INSERT INTO items VALUES
   ('00000002', '電気ポット', '0002', 4000),
   ('00000003', '電子レンジ', '0002', 20000);
INSERT 0 2

また、テーブル作成時に設定したカラムの定義に反する場合、エラーとなりデータは登録できません。
例えば、今回の “items” テーブルでは第3カラムは4文字以内と制限をかけましたが、ここに5文字以上を入れようとすると、このようにエラーになります。

test=# INSERT INTO items VALUES ('00000004', 'トースター', '00003', 3000);
ERROR:  value too long for type character varying(4)

■データの取得:SELECT 文

続いて、登録したデータを見る方法です。
データを見るためのコマンドの基本は、以下のような形です。

=# SELECT
    , ,…
  FROM ;

例えば、先の “items” テーブルから “name” と “price”、”ManufacturerID” のカラムの情報を取りたいなら以下のようになります。

test=# SELECT name, price, ManufacturerID FROM items;
    name    | price | manufacturerid
------------+-------+----------------
 電子レンジ |  9000 | 0001
 電気ポット |  4000 | 0002
 電子レンジ | 20000 | 0002
(3 rows)

全てのカラムの情報を取る場合、カラム名を列挙する代わりに “*” を使用することもできます。

test=# SELECT * FROM items;
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000001 | 電子レンジ | 0001           |  9000
 00000002 | 電気ポット | 0002           |  4000
 00000003 | 電子レンジ | 0002           | 20000
(3 rows)

■絞り込み:WHERE 句

SELECT 文などの結果を特定の条件で絞り込みたい場合には、”WHERE 句” を使用します。

“WHERE 句” は単独では使用することはできず、SELECT 文や後述の UPDATE 文、DELETE 文などと合わせて使用します。
例えば、SELECT と一緒に使う場合は以下のような形になります。

=# SELECT
    , ,…
  FROM 
  WHERE ;

これを使えば、例えば指定したカラムに特定の名前を持つデータ (レコード) や、指定したカラムの値が一定以上のデータ…と言った条件に沿ったデータのみを取得することができます。

test=# SELECT * FROM items WHERE name = '電気ポット';
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000002 | 電気ポット | 0002           |  4000
(1 row)

test=# SELECT * FROM items WHERE ManufacturerID != '0001';
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000002 | 電気ポット | 0002           |  4000
 00000003 | 電子レンジ | 0002           | 20000
(2 rows)

test=#

■データの更新:UPDATE 文

登録済みのデータの内容を変更する場合は、UPDATE 文を使います。
UPDATE の基本的な使用法は、以下のような形です。

=# UPDATE  SET
   = ;

WHERE 句を使用しないと全てのデータが更新されるため、基本的には WHERE 句で条件を絞って使用することになるかと思います。

例として、先の items テーブルの ID:”00000003″ のメーカー ID を、確認しながら変更してみます。

test=# SELECT * FROM items;
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000001 | 電子レンジ | 0001           |  9000
 00000002 | 電気ポット | 0002           |  4000
 00000003 | 電子レンジ | 0002           | 20000
(3 rows)

test=# UPDATE items SET ManufacturerID = '0003' WHERE itemID = '00000003';
UPDATE 1
test=# SELECT * FROM items;
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000001 | 電子レンジ | 0001           |  9000
 00000002 | 電気ポット | 0002           |  4000
 00000003 | 電子レンジ | 0003           | 20000
(3 rows)

■データの削除:DELETE 文

登録済みのデータを削除したい場合は、DELETE 文を使用します。
DELETE は、基本的には以下のように使います。

=# DELETE FROM ;

WHERE 句なしだと指定したテーブルの中身が丸ごと吹き飛ぶので、基本的には WHERE 句で条件を絞り込んで使うことになるでしょう。

例えば、先の items テーブルからメーカー ID:”0002″ の商品を、確認しながら削除してみます。

test=# SELECT * FROM items;
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000001 | 電子レンジ | 0001           |  9000
 00000002 | 電気ポット | 0002           |  4000
 00000003 | 電子レンジ | 0003           | 20000
(3 rows)

test=# DELETE FROM items WHERE ManufacturerID = '0002';
DELETE 1

test=# SELECT * FROM items;
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000001 | 電子レンジ | 0001           |  9000
 00000003 | 電子レンジ | 0003           | 20000
(2 rows)

■他にも…

この他にも、複数のテーブルを特定の条件で繋げて表示する “JOIN 句” や、複数の SQL による更新が一括で行われるようにする操作 “トランザクション” などの標準的なものをはじめ、様々な操作方法がありますので実際に使っていく場合はドキュメントも必要に応じて確認するようにしてください。

test=# SELECT * FROM items;
  itemid  |    name    | manufacturerid | price
----------+------------+----------------+-------
 00000001 | 電子レンジ | 0001           |  9000
 00000003 | 電子レンジ | 0003           | 20000
(2 rows)

test=# SELECT * FROM Manufacturer;
  id  |  name
------+--------
 0001 | hoge社
 0002 | huga社
 0003 | piyo社
(3 rows)

test=# SELECT * FROM items INNER JOIN Manufacturer ON items.ManufacturerID = Manufacturer.ID;
  itemid  |    name    | manufacturerid | price |  id  |  name
----------+------------+----------------+-------+------+--------
 00000001 | 電子レンジ | 0001           |  9000 | 0001 | hoge社
 00000003 | 電子レンジ | 0003           | 20000 | 0003 | piyo社
(2 rows)

■最後に

今回は PostgreSQL の、基本的な使い方を見てきました。

これまでの回と見比べてみるとわかるかと思いますが、設定や接続の方法などは異なるものの、一度接続してしまえば基本的な部分ではこれまでに紹介した MySQL、MariaDB とほとんど同じ方法で操作できることが確認できるかと思います。

[他の回] わからないなりに理解したいデータベース①:RDB編:MySQL①
わからないなりに理解したいデータベース②:RDB編:MySQL②
わからないなりに理解したいデータベース③:RDB編:MariaDB
(今回) わからないなりに理解したいデータベース④:RDB編:PostgreSQL
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です