Open17

PostgreSQL 学習記

PaalonPaalon

今までの人生で関係データベースや SQL には全く触れて来なかった人間が PostgreSQL を触る記録。

PaalonPaalon

PostgreSQL を題材に選んだ理由はオープンソースのもので一番使われている主要なやつらしいからだ。
公式サイトを見ると、PostgreSQL の現在の最新の安定版は 16 のようだ。その版のドキュメントを見る。歴史について書いてある。PostgreSQL はカリフォルニア大学バークレー校で開発された POSTGRES の派生らしい。1980 年代からの歴史があるようだ。ごにょごにょ細かいことが書いてあるが、要は歴史が長いということだろう。とりあえずインストール方法を見ると、ソースコードからごりごりビルドする方法が記述されている。ただ、学ぶためにインストールしたいので、そんなことはやりたくないので、Homebrew でインストールしようと思う。

$ brew info postgresql
Warning: Formula postgresql was renamed to postgresql@14.
==> postgresql@14: stable 14.13 (bottled)
Object-relational database system
https://www.postgresql.org/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/p/postgresql@14.rb
License: PostgreSQL
==> Dependencies
Build: pkg-config ✔
Required: icu4c ✔, krb5 ✔, lz4 ✔, openssl@3 ✔, readline ✔
==> Caveats
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /usr/local/var/postgresql@14
For more details, read:
  https://www.postgresql.org/docs/14/app-initdb.html

To start postgresql@14 now and restart at login:
  brew services start postgresql@14
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/postgresql@14/bin/postgres -D /usr/local/var/postgresql@14
==> Analytics
install: 49,224 (30 days), 135,756 (90 days), 573,312 (365 days)
install-on-request: 47,739 (30 days), 131,194 (90 days), 557,478 (365 days)
build-error: 25 (30 days)

なんだか不穏な表示である。

$ brew search postgresql
==> Formulae
postgresql@10     postgresql@12     postgresql@14     postgresql@16     postgrest
postgresql@11     postgresql@13     postgresql@15     qt-postgresql

==> Casks
navicat-for-postgresql                       posture-pal

If you meant "postgresql" specifically:
postgresql breaks existing databases on upgrade without human intervention.

See a more specific version to install with:
  brew formulae | grep postgresql@

なんか適当に入れるとヤバそうなので調べる。みんなバージョンを指定してインストールすることを推奨しているのでそれに従うことにする。

brew install postgresql@16

多分入った。

PaalonPaalon

よく分からない次のコマンドを実行する。

 brew services start postgresql@16
PaalonPaalon

データーベースの作成には

createdb mydb

せよと書いてあるが、コマンドが見つからない。

PaalonPaalon

使っている Fish が認識するようにパスを追加しなければならなかったようだ。

$HOME/.config/fish/config.fish
# PostgreSQL 16
fish_add_path /usr/local/opt/postgresql@16/bin
PaalonPaalon

作成したデータベースの削除をする。

dropdb mydb

実行できた。

PaalonPaalon

書かれている通りにコマンドを入力してみる。

mydb=# SELECT version();
                                                           version
------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 16.4 (Homebrew) on x86_64-apple-darwin22.6.0, compiled by Apple clang version 15.0.0 (clang-1500.1.0.2.5), 64-bit
(1)

mydb=# SELECT current_date;
 current_date
--------------
 2024-09-24
(1)

mydb=# SELECT 2 + 2;
 ?column?
----------
        4
(1)
PaalonPaalon

\⟨command⟩ で SQL コマンドでない内部コマンドを実行できる。\h でヘルプを表示。\qpsql を終了する。

PaalonPaalon

PostgreSQL という言葉がどこまでを指すのかが良く分かっていない。とりあえず、実行ファイル群を見る。

$ ls /usr/local/opt/postgresql@16/bin
clusterdb*         pg_archivecleanup* pg_receivewal*     pg_waldump*
createdb*          pg_basebackup*     pg_recvlogical*    pgbench*
createuser*        pg_checksums*      pg_resetwal*       postgres*
dropdb*            pg_config*         pg_restore*        psql*
dropuser*          pg_controldata*    pg_rewind*         reindexdb*
ecpg*              pg_ctl*            pg_test_fsync*     vacuumdb*
initdb*            pg_dump*           pg_test_timing*    vacuumlo*
oid2name*          pg_dumpall*        pg_upgrade*
pg_amcheck*        pg_isready*        pg_verifybackup*
PaalonPaalon

とりあえず PostgreSQL のシステムは複数の database を持ち、各々の database は複数の table を持ち、1つ1つの table が2次元の配列になっていて、その配列の各 row が一意な key を持ち、row を record や tupleと呼ぶのかな?

PaalonPaalon

関係データベースの用語を調べる。Wikipedia を見てみる。https://en.wikipedia.org/wiki/Relational_database#Terminology.

SQL term Relational database term Description
row tuple or reord A data set representing a single term
column attribute or field A labeled element of a tuple
table relation or base relvar A set of tuples sharing the same attributes
view or result set derived relvar Any set of tuples

なるほど。