Psycopg2とPostgreSQL徹底解説: PythonからDB操作をマスター!


PythonでWebアプリケーションやデータ処理を行う際、リレーショナルデータベースは欠かせません。特に高機能で信頼性の高いデータベースとして人気なのがPostgreSQLです。そして、PythonからPostgreSQLを操作する際に最もデファクトスタンダードとして使われているのがPsycopg2ライブラリです。

この記事では、Psycopg2を使ってPythonからPostgreSQLを操作するための基礎から応用までを、初心者にもわかりやすく徹底解説します。


Psycopg2とは?

Psycopg2は、PythonでPostgreSQLデータベースを操作するためのアダプター(DB API 2.0準拠)です。C言語で記述されたPostgreSQLのネイティブライブラリであるlibpqをラップしているため、高速かつ堅牢なデータベースアクセスを実現します。

なぜPsycopg2とPostgreSQLの組み合わせが良いのか?

  • PostgreSQL:

    • 高機能・高信頼性: 複雑なデータ型、JSONBサポート、トランザクション分離レベルの豊富さなど、エンタープライズレベルの機能を持つ。

    • 拡張性: 多くの拡張機能(GISのPostGISなど)が利用可能。

    • オープンソース: 商用利用も可能で、ライセンス費用がかからない。

  • Psycopg2:

    • デファクトスタンダード: PythonからPostgreSQLを扱う際の標準的なライブラリ。

    • 高速性: C言語実装により、Pythonのみで書かれたライブラリよりも高速。

    • 安全なSQL実行: プレースホルダによるパラメータバインディングをサポートし、SQLインジェクション対策が可能。


Psycopg2を始めるための準備

1. PostgreSQLのインストールと設定

まず、PostgreSQLサーバーが必要です。お使いのOSに応じた方法でインストールしてください。(例: sudo apt-get install postgresql postgresql-contrib on Ubuntu, Homebrew on macOSなど)。

インストール後、データベースとユーザーを作成します。

SQL
 
-- データベースの作成
CREATE DATABASE mydatabase;

-- ユーザーの作成とパスワード設定
CREATE USER myuser WITH PASSWORD 'mypassword';

-- データベースへの権限付与
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;

2. Psycopg2のインストール

Python環境にPsycopg2をインストールします。

Bash
 
pip install psycopg2-binary

psycopg2-binaryは、コンパイル済みのバイナリパッケージなので、通常はこちらが推奨されます。


Psycopg2の基本的な使い方

PythonからPostgreSQLを操作する際の基本的な流れは以下の通りです。

  1. データベースへの接続: psycopg2.connect()を使用。

  2. カーソルの作成: SQLクエリを実行するためのオブジェクト。

  3. SQLクエリの実行: cursor.execute()を使用。

  4. 結果の取得(SELECTの場合): cursor.fetchone()cursor.fetchall()を使用。

  5. 変更のコミット(INSERT/UPDATE/DELETEの場合): connection.commit()を使用。

  6. 接続のクローズ: cursor.close()connection.close()を使用。

データベース接続と簡単なクエリ実行の例

Python
 
import psycopg2

# データベース接続情報
DB_HOST = "localhost"
DB_NAME = "mydatabase"
DB_USER = "myuser"
DB_PASS = "mypassword"

conn = None # コネクションオブジェクトの初期化
cursor = None # カーソルオブジェクトの初期化

try:
    # 1. データベースへの接続
    conn = psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS)
    print("データベースに接続しました!")

    # 2. カーソルの作成
    cursor = conn.cursor()

    # 3. SQLクエリの実行(テーブル作成)
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS users (
            id SERIAL PRIMARY KEY,
            name VARCHAR(100) NOT NULL,
            email VARCHAR(100) UNIQUE
        );
    """)
    conn.commit() # 変更をコミット
    print("usersテーブルを作成または確認しました。")

    # 3. SQLクエリの実行(データ挿入)
    cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", ("Alice", "alice@example.com"))
    cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", ("Bob", "bob@example.com"))
    conn.commit()
    print("データを挿入しました。")

    # 3. SQLクエリの実行(データ取得)
    cursor.execute("SELECT id, name, email FROM users ORDER BY id DESC LIMIT 1;")
    user = cursor.fetchone() # 1件取得
    if user:
        print(f"取得データ: ID={user[0]}, Name={user[1]}, Email={user[2]}")

except psycopg2.Error as e:
    print(f"データベースエラー: {e}")
    if conn:
        conn.rollback() # エラー時はロールバック
finally:
    # 6. 接続のクローズ
    if cursor:
        cursor.close()
    if conn:
        conn.close()
    print("データベース接続を閉じました。")

重要なポイントとベストプラクティス

1. withステートメントによるリソース管理

withステートメントを使うと、接続やカーソルが自動的に閉じられるため、クローズし忘れを防ぐことができます。

Python
 
import psycopg2

# データベース接続情報 (上記と同じ)

try:
    with psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS) as conn:
        with conn.cursor() as cursor:
            cursor.execute("SELECT version();")
            db_version = cursor.fetchone()
            print(f"PostgreSQLバージョン: {db_version[0]}")
except psycopg2.Error as e:
    print(f"エラー: {e}")

2. SQLインジェクション対策(プレースホルダ)

SQLクエリに直接ユーザー入力を埋め込むと、SQLインジェクションの脆弱性につながります。Psycopg2は、%sなどのプレースホルダを使用して安全にパラメータをバインドする機能を提供しています。絶対に文字列結合でSQLを生成しないでください。

Python
 
# 安全な方法: プレースホルダを使用
user_name = "Charlie"
user_email = "charlie@example.com"
cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", (user_name, user_email))

# 危険な方法: 文字列結合(絶対に行わない)
# sql_query = f"INSERT INTO users (name, email) VALUES ('{user_name}', '{user_email}');"
# cursor.execute(sql_query)

3. トランザクション管理

複数のSQL操作を一つの論理的な単位として扱うのがトランザクションです。Psycopg2では、conn.commit()で変更を確定し、conn.rollback()で変更を取り消します。エラーハンドリングと組み合わせることで、データの整合性を保てます。


まとめ

この記事では、PythonからPostgreSQLを操作するための強力なライブラリであるPsycopg2について、そのインストールから基本的な操作、そして安全なデータベースアクセスのためのベストプラクティスまでを解説しました。

Psycopg2とPostgreSQLの組み合わせは、Pythonアプリケーションで堅牢なデータ永続化層を構築するための非常に効果的な選択肢です。ぜひ、この記事を参考にあなたのPythonプロジェクトにデータベース操作を組み込んでみてください!

■「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座