PostgreSQLを習得する: 開発者のためのインストールと必須CRUD操作

Database tutorial - IT technology blog
Database tutorial - IT technology blog

問題: データベースの基本を理解する

ITエンジニアとして、私はデータインフラストラクチャによって数え切れないほどのプロジェクトが成功したり失敗したりするのを見てきました。データベースは単なるストレージではなく、ユーザープロファイルから重要なビジネス取引まで、あらゆるものを管理するほとんどのアプリケーションの心臓部です。適切なデータベースを選択し、それを効果的に使用する方法を知ることは非常に重要です。

MySQL、PostgreSQL、MongoDBを様々なプロジェクトで扱ってきた経験から、それぞれに独自の強みがあることが分かりました。MySQLは広く普及しておりシンプルさが特徴で、MongoDBは特定のNoSQLユースケースで優れた能力を発揮します。

しかし、多くの堅牢で機能豊富なアプリケーションにおいて、PostgreSQLはしばしばその真価を発揮します。エンタープライズグレードの機能、拡張性、SQL標準への強力な準拠は、開発者やシステムアーキテクトにとって最高の選択肢となっています。それでも、PostgreSQLを初めて使う人にとっては、最初のセットアップや基本的なデータ操作は少し大変に感じるかもしれません。

コアコンセプト: PostgreSQLを探求する価値がある理由

PostgreSQL(しばしばPostgresと呼ばれる)は、強力なオープンソースのオブジェクトリレーショナルデータベースシステムです。信頼性、堅牢な機能、パフォーマンスにおいて優れた評価を得ています。これは単なる普通のデータベースではなく、献身的なコミュニティによって継続的に改善され、数十年にわたるベストプラクティスを具現化した、この分野のベテランです。

PostgreSQLが最高の選択肢となる主要な機能:

  • ACID準拠: これは単なる専門用語ではありません。データトランザクションが確実に処理されることを意味します。原子性、一貫性、独立性、永続性が保証されます。これにより、システムがクラッシュした場合でもデータ整合性が確保され、金融システムのような重要なアプリケーションにとって不可欠です。
  • 拡張性: Postgresは非常に適応性が高いです。独自のデータ型を定義したり、カスタム関数を構築したり、さまざまなプログラミング言語(PythonやPerlなど)でコードをデータベース内で直接記述することもできます。この柔軟性は、複雑な要件や進化する要件にとって大きな利点です。
  • 高度なデータ型: 標準の数値や文字列を超えて、PostgreSQLは豊富なデータ型をサポートしています。これには配列、JSONB(効率的なクエリのためのバイナリJSON)、UUID、幾何学的型などが含まれます。これにより、データベーススキーマ内で複雑なデータ構造をより自然にモデル化できます。
  • 同時実行制御 (MVCC): マルチバージョン同時実行制御により、多くのユーザーが競合なく同時にデータにアクセスおよび変更できます。これにより、パフォーマンスが向上し、データの一貫性が全体にわたって保証されます。
  • 強力なコミュニティサポート: オープンソースプロジェクトとして、PostgreSQLは活気あるグローバルコミュニティによって発展しています。このコミュニティは、その開発やドキュメント作成に貢献し、フォーラムやリソースを通じて広範なサポートを提供しています。

私は通常、データ整合性、高度なクエリ機能、将来の拡張性が高い優先事項である場合にPostgreSQLを選択します。その安定性により、Webアプリケーション、データウェアハウス、さらには地理空間データ処理のための優れたバックエンドとなります。

実践: PostgreSQLを始める

本当の学習は、実践する時から始まります。PostgreSQLをインストールし、データベース操作の核心であるCRUD操作について深く掘り下げていきましょう。

1. インストール: PostgreSQLサーバーのセットアップ

私のPostgreSQLの旅は、たいてい新しいサーバーから始まります。最初の課題は常に、それを適切にセットアップすることです。インストールはオペレーティングシステムによって多少異なりますが、UbuntuのようなLinuxディストリビューションでのプロセスは非常に簡単です。

Ubuntu/Debianの場合:


sudo apt update
sudo apt install postgresql postgresql-contrib

このコマンドは、PostgreSQLサーバーと、補足モジュールおよびユーティリティを提供するpostgresql-contribパッケージをインストールします。PostgreSQLサービスは通常、インストール後に自動的に起動します。

インストールを確認する:


systemctl status postgresql

サービスがアクティブで実行中であることを示す出力が表示されるはずです。

macOSの場合:

Homebrewが最も簡単な方法です:


brew install postgresql
brew services start postgresql

Windowsの場合:

公式PostgreSQLウェブサイトでは、優れたインストーラーが提供されています。このツールは、強力なグラフィカル管理ツールであるpgAdminの設定を含め、セットアッププロセス全体をガイドしてくれます。これについては後で説明します。

2. 基本的なデータベース管理: ユーザーとデータベースの作成

インストールが完了したら、構築を開始するためのワークスペース(データベースと正しい権限を持つユーザー)が必要です。デフォルトでは、PostgreSQLはスーパーユーザー権限を持つpostgresという名前のユーザーを作成します。このアカウントを使用して、アプリケーション固有のユーザーとデータベースをセットアップします。

まず、postgresシステムユーザーに切り替えます:


sudo -i -u postgres

次に、PostgreSQLコマンドラインインターフェース(psql)にアクセスします:


psql

これで、psqlプロンプト内で、新しいデータベースユーザー(PostgreSQLの用語では「ロール」と呼ばれます)とデータベースを作成できます:


-- 私たちのアプリケーション用の新しいロール(ユーザー)を作成します
CREATE ROLE myapp_user WITH LOGIN PASSWORD 'strong_password_here';

-- 新しいユーザーが所有するデータベースを作成します
CREATE DATABASE myapp_db OWNER myapp_user;

-- 新しいユーザーにデータベースに対するすべての権限を付与します(オプション、すでに所有者の場合)
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;

psqlを終了するには、\qと入力してEnterを押します。postgresシステムユーザーを終了するには、exitと入力します。

これで、myapp_userとして新しいデータベースに接続できます:


psql -U myapp_user -d myapp_db

設定したパスワードの入力を求められます。接続後、\lでデータベースを一覧表示し、\dでテーブルを一覧表示します(いくつか作成した後で!)。

GUI管理にpgAdminを使用する

psqlは強力ですが、pgAdminのようなグラフィカルツールは、特に初心者にとってデータベース管理を大いに簡素化できます。WindowsにPostgreSQLをインストールした場合、すでに含まれているかもしれません。他のオペレーティングシステムでは、別途インストールできます。pgAdminは、サーバー、データベース、テーブルを管理するためのウェブベースのインターフェースを提供し、簡単にクエリを実行できます。SQLコマンドに慣れてしまえば、素晴らしい視覚補助となります。

3. CRUD操作: データインタラクションの基礎

実際の作業は、アプリケーションデータを保存および操作する必要があるときに始まります。ここでCRUD操作が私たちの日常の必需品となります。CRUDはCreate(作成)、Read(読み取り)、Update(更新)、Delete(削除)の略で、これらは任意のデータベースシステムで永続データに対して実行する4つの基本的な操作です。これらのコマンドを習得することは、データ駆動型アプリケーションを構築するための基本です。

CREATE: テーブルの構築とデータの追加

データを追加する前に、それらを保持する構造、つまりテーブルが必要です。簡単なproductsテーブルを作成してみましょう。


CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    description TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

このCREATE TABLE文を分解してみましょう:

  • id SERIAL PRIMARY KEY: これは各製品の一意な識別子を作成します。SERIALは新しい行に対して自動的にインクリメントされ、PRIMARY KEYは一意性を強制し、主要な識別子として機能します。
  • name VARCHAR(100) NOT NULL: 製品名用の文字列フィールドで、100文字に制限されます。空にすることはできません(NOT NULL)。タイトルなどの短い文字列に最適です。
  • price DECIMAL(10, 2) NOT NULL: 価格用の数値フィールドです。小数点以下2桁を含め、合計最大10桁まで可能です。通貨の値に最適です。
  • description TEXT: 製品詳細用のより長いテキストフィールドです。
  • created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP: これは、タイムゾーン情報を含め、製品が追加された日時を自動的に記録します。

次に、INSERT INTO文を使用してテーブルにデータを投入しましょう:


INSERT INTO products (name, price, description) VALUES
('Laptop Pro', 1200.00, 'プロフェッショナル向けのパワフルなノートパソコン'),
('Wireless Mouse', 25.50, 'エルゴノミクスデザイン'),
('Mechanical Keyboard', 99.99, 'タクタイルスイッチ付きRGBバックライト');

READ: データベースからの情報取得

データの読み取りは、多くの場合、最も頻繁に行われる操作です。ここではSELECT文が主要なコマンドとなります。

productsテーブルからすべてのデータを取得する:


SELECT * FROM products;

特定の列を選択する:


SELECT name, price FROM products;

WHERE句による結果のフィルタリング: 特定の条件を満たすデータのみを取得できます。


-- 50ドルよりも高価な製品
SELECT * FROM products WHERE price > 50.00;

-- 名前に「Keyboard」を含む製品
SELECT * FROM products WHERE name LIKE '%Keyboard%';

-- 20ドルから100ドルの間の製品
SELECT * FROM products WHERE price BETWEEN 20.00 AND 100.00;

-- 複数の条件に一致する製品
SELECT * FROM products WHERE price > 20 AND name LIKE 'Wireless%';

ORDER BYによる結果の並べ替えとLIMITによる制限:


-- 価格を降順で並べ替える
SELECT name, price FROM products ORDER BY price DESC;

-- 最も高価な製品の上位2つのみを取得する
SELECT name, price FROM products ORDER BY price DESC LIMIT 2;

UPDATE: 既存レコードの変更

データが変更された場合、既存のレコードを変更するためにUPDATE文を使用します。常にWHERE句を使用することを忘れないでください。そうしないと、テーブル内の*すべての*行が更新されてしまいます!


-- 「Laptop Pro」の価格を更新する(id=1と仮定)
UPDATE products SET price = 1150.00 WHERE id = 1;

-- すべてのキーボードの説明を更新する
UPDATE products SET description = '高性能ゲーミング周辺機器' WHERE name LIKE '%Keyboard%';

DELETE: テーブルからのデータ削除

レコードを削除するには、DELETE文を使用します。ここでも、誤ってすべてのデータを削除してしまうのを防ぐために、WHERE句が非常に重要です!


-- 「Wireless Mouse」製品を削除する(id=2と仮定)
DELETE FROM products WHERE id = 2;

-- 価格が30ドル未満のすべての製品を削除する
DELETE FROM products WHERE price < 30.00;

重要: DELETE vs. TRUNCATE

  • DELETE FROM table_name;: このコマンドはすべての行を削除します。これはトランザクション操作であり、ロールバックが可能で、外部キー制約を尊重します。非常に大きなテーブルでは処理が遅くなります。
  • TRUNCATE TABLE table_name;: これは、特に大きなテーブルの場合、個々の行の削除をログに記録しないため、すべての行を削除するはるかに高速な操作です。ただし、トランザクション操作ではない(ロールバックできない)ため、通常、SERIAL型の列(idなど)を初期値にリセットします。注意して使用してください!

結論: PostgreSQLの旅が始まる

PostgreSQLを使い始めるための基本的な最初の一歩を学びました。これには、サーバーのセットアップ、最初のデータベースとユーザーの作成、そして基本的なCRUD操作の実行が含まれます。これらの操作は、ほとんどすべてのデータインタラクションの根幹をなします。

このチュートリアルは、強力な出発点となります。ここから、より高度なPostgreSQL機能を探求できます。これには、パフォーマンスのためのインデックス作成、テーブル間のリレーションシップ定義、JOINやサブクエリを使用した複雑なクエリの作成、データ整合性を確保するためのトランザクションの理解などが含まれます。PostgreSQLは深く、学ぶ価値のあるシステムであり、これらの基本的な操作は、プロジェクトでその可能性を最大限に引き出すための入り口です。

Share: