PythonでPostgreSQLに接続する方法|psycopg2で学ぶDB操作入門

Pythonでデータベースに直接つなげるようになると、世界が少し広がります。
エクセルやCSVを経由せず、リアルタイムでPostgreSQLからデータを取得して処理する。
そんな“ひと手間減らせる仕組み”を、Pythonとpsycopg2を使って実現してみましょう。

この記事では、環境の整え方から実際の接続、そしてデータをpandasで読み取るところまでを、ひとつずつやさしく解説します。
難しいことは抜きにして、「動かしてみる」ことを第一に。
コマンドを入力しながら、少しずつ“自分の手で扱えるデータベース”を育てていきましょう。

目次

psycopg2をインストールしよう

まずはPythonのライブラリをインストールします。
PostgreSQLを扱う代表的なライブラリが psycopg2 です。

Bash
pip install psycopg2-binary

-binary は、WindowsやmacOSなど異なる環境でも簡単に動かせる便利なパッケージです。
もし環境構築でつまずく場合は、仮想環境(venvなど)を使うとトラブルを減らせます。

psycopg2の基本:接続とクエリ実行

インストールが完了したら、いよいよPostgreSQLへ接続します。
接続情報(ホスト名・ポート・データベース名・ユーザー名・パスワード)を設定して、Pythonから直接アクセスしてみましょう。

Python
import psycopg2

# PostgreSQLへ接続
conn = psycopg2.connect(
    host="localhost",
    port="5432",
    database="sample",
    user="postgres",
    password="your_password"
)

# カーソルを作成
cur = conn.cursor()

# SQLを実行
cur.execute("SELECT version();")
print(cur.fetchone())

# 終了処理
cur.close()
conn.close()

このコードを実行すると、PostgreSQLのバージョンが表示されれば接続成功です。
「psycopg2は動いたけどデータが見えない」という場合は、ユーザー権限やポート設定を見直してみましょう。

ここまでで、PythonとPostgreSQLの“会話”ができるようになりました。
あとはデータを取得して、使いやすい形に整えるだけです。

pandasでデータを扱いやすくする

取得したデータを分析やレポートに使う場合、pandas がとても便利です。
SQLでデータを呼び出し、そのままDataFrameに変換できます。

Python
import pandas as pd

# psycopg2の接続を再利用
query = "SELECT id, name, stock FROM products"
df = pd.read_sql(query, conn)

print(df.head())

DataFrameにすれば、データ加工・集計・グラフ化が一気に進みます。
Excelで行っていた作業を、Pythonスクリプトにまとめることも可能です。

pandasを使うと、データベースから直接データを読み込み、
すぐに分析やグラフ作成に移れる“データ処理の自動化ルート”が完成します。

接続設定の詳細(参考)

接続には以下の情報が必要です。

項目説明
ホスト名localhostローカル環境でテストする場合
ポート番号5432PostgreSQLのデフォルトポート
データベース名sample接続対象のデータベース名
ユーザー名postgres接続ユーザー
パスワードyour_passwordログインに使用するパスワード

これらを psycopg2.connect() に設定して接続します。
設定情報は .env ファイルなどで安全に管理するのがおすすめです。

データベースからのデータ取得

pandasを使うと、SQLの結果を直接DataFrameに読み込めます。
次の例では、テーブル test_table からすべてのデータを取得します。

Python
query = "SELECT * FROM test_table;"
df = pd.read_sql(query, conn)
print(df.head())

このクエリは、test_tableという名前のテーブルからすべての行とすべての列を取得するシンプルなものです。SQL文の基本的な構造は、SELECT 句に続けて取得したい列を指定し、FROM句で対象のテーブルを指定する形になります。SELECT 句の後の ワイルドカードで、すべての列を意味します。

必要に応じて、WHERE句でデータを絞り込むことも可能です。

絞り込み条件をつけてデータを取得してみよう

データをすべて取得するだけでなく、
「特定の期間」や「特定の品種」など、条件をつけて絞り込みたい場面もあります。

たとえば、2025年のデータだけを取得したい場合は、次のようにSQLを書きます。

SQL
SELECT *
FROM test_table
WHERE date BETWEEN '2025-01-01' AND '2025-12-31'
  AND variety = '特定の品種';

これを実際のPythonコードに組み込むと、次のようになります。

Python
import psycopg2
import pandas as pd

# PostgreSQLへ接続
conn = psycopg2.connect(
    host="localhost",
    port="5432",
    database="sample",
    user="postgres",
    password="your_password"
)

# 条件付きのSQLを準備
query = """
SELECT *
FROM test_table
WHERE date BETWEEN '2025-01-01' AND '2025-12-31'
  AND variety = '特定の品種';
"""

# SQLの実行 → pandasのDataFrameに変換
df = pd.read_sql(query, conn)

# 先頭5行を表示して確認
print(df.head())

# 終了処理
conn.close()

これで、条件に一致したデータだけをDataFrameとして取得できます。
Excelのフィルター操作のように、Python側で必要な範囲だけを取り出せるのが便利なところです。

WHERE句に複数の条件を組み合わせるときは、AND(かつ)や OR(または)を使って調整できます。
たとえば「ある期間のデータ」かつ「特定の担当者のデータ」など。

トラブルを防ぐ3つのコツ

・接続情報は「.env」ファイルなどに分離し、直接コードに書かない

・PostgreSQLが起動しているか「sudo systemctl status postgresql」で確認する

・処理後は「conn.close()」を忘れずに(接続リソースを解放)

まとめ

psycopg2-binaryを使えば、PythonからPostgreSQLへ簡単に接続し、SQLで必要なデータを自在に扱えます。
さらにpandasを組み合わせれば、分析や自動化もスムーズに。

私自身、2年前からこの方法を使い続けています。
以前はExcelをエクスポートしてpandasで処理していましたが、いまではデータベースから直接取得して分析できるようになり、作業効率が大きく変わりました。

「SQLは難しそう」と感じていた方も、ほんの数行のPythonコードでデータが動く感動を、ぜひ体験してみてください。
“つなぐ”ことから始まる自動化の世界が、きっとあなたの作業を軽やかにしてくれます。

この記事を書いた人

目次