【Python 初心者】PostgreSQLとの接続と接続エラー

Python(Cpython)でPosgreSQLデータベースに接続し、データを読み込む処理を紹介します。Pythonでもデータベースを使用する機会は多く、「AI/機械学習モデルのデータ準備」や「Webアプリのバックエンド」等でデータベースとやり取りを行います。
又、接続時に発生するエラーについても紹介します。


【Python 初心者】PostgreSQLに接続する

使用環境

  • OS
    • Windows 10 Pro 22H2
    • OSビルド:19045.5011
  • コードエディタ(IDE)
    • Visual Studio Code Ver. 1.94
      ※仮想環境(v_posgre)を作成して実行しています。
  • Python:Ver. 3.10.11
  • PostgreSQL:Ver. 16.2


Python PosgreSQL 接続コーディング例

コーディング例を下記に示します。
今回は、PythonがPostgreSQLのデータベースに接続する為のライブラリとして、最も広く使われている「psycopg2」を使用しました。「psycopg2」ライブラリはターミナルからpipコマンドでインストールします。


  • 「psycopg2」のインストール:pip install psycopg2
(v_posgre) PS C:\Python_Sample_posbre_connect> pip install psycopg2
Collecting psycopg2
  Using cached psycopg2-2.9.10-cp310-cp310-win_amd64.whl.metadata (5.0 kB)
Using cached psycopg2-2.9.10-cp310-cp310-win_amd64.whl (1.2 MB)
Installing collected packages: psycopg2
Successfully installed psycopg2-2.9.10
(v_posgre) PS C:\Python_Sample_posbre_connect> pip list
Package    Version
---------- -------
pip        24.2
psycopg2   2.9.10
setuptools 65.5.0


  • PostgreSQLデータベースの接続とレコード読み込みのコーディング例
    ③で接続に必要な情報を指定し、接続情報を取得します。
    ④でカーソルを作成し、⑤でSELECT文を実行します。
    ⑥のfetchall()で、全レコードを配列に格納し、⑦で1レコードづつターミナルに出力します。
    ⑧で例外処理を定義し、⑨で接続情報を開放します。
import psycopg2                         # ①PostgreSQL接続用ラブラリー

try:
    connection = None                   # ②connectionの初期化

    # ③データベース接続設定
    connection = psycopg2.connect(
        user="postgres",                # PostgreSQLのユーザー名
        password="xxxxxx",              # パスワード
        host="localhost",               # ホスト(通常は'localhost')
        port="5432",                    # ポート番号(通常は5432)
        database="customer"             # 接続するデータベース名
    )
    
    # ④カーソルを作成
    cursor = connection.cursor()
    
    # ⑤SQLクエリの実行(customer_tblのレコードを全て読み込む)
    cursor.execute("SELECT * FROM customer_tbl;")
    
    # ⑥結果をすべて取得
    rows = cursor.fetchall()
    
    # ⑦読み込んだレコードを全てターミナルに出力
    for row in rows:
        print(row)

# ⑧例外処理
except (Exception, psycopg2.Error) as error:
    print("エラーが発生しました:", error)

# ⑨終了処理
finally:
    # 接続を閉じる
    if connection:
        cursor.close()
        connection.close()
        print("PostgreSQL接続をクローズしました。")


  • コーディングの実行結果

(1, '00001', '佐藤', '一郎', 'man', 30, 'A0001', '人事部')
(2, '00002', '山田', '太郎', 'man', 25, 'B0001', '営業部')  
(3, '00003', '田中', '花子', 'woman', 28, 'C0001', '秘書室')
PostgreSQL接続をクローズしました。
(v_posgre) PS C:\Python_Sample_posbre_connect> 


Visual Studio Code のインストール


PostgreSQLのインストール


VSCodeでの、Pythonのインストール

下記の手順でPythonをインストールします。

  • ①「拡張機能」のアイコンをクリック
  • ②検索欄に「Python」と入力:Ptyhon関係の拡張機能が表示されます。
  • ③「拡張機能」の中の「Python」をクリックし、リリースバージョンをインストールします。

「Python」のインストールが開始します。

「拡張機能パック」として、「Pylance」「Python Debugger」もインストールされます。

  • Pylance
    Pyrightという型チェックツールを使い、コードの型ヒントを提供しながら、コード補完、型チェック、モジュールの自動インポートなどを強化する機能を備えています。
  • Python Debugger
    Visual Studio Code内でPythonコードをデバッグするための機能です。


Python PostgreSQL 接続エラー/実行時エラー

PythonとPostgreSQLを接続する際、接続やクエリ実行中に発生するエラーは、接続設定やSQLの記述ミス、権限など様々な原因が考えられます。以下によくあるエラーコードとその内容、解決方法を紹介します。


エラーコード: 08001 – Connection Refused

  • 内容:PostgreSQLサーバーに接続できません。
  • 原因と解決策
    • サーバーが起動しているか確認する。
    • hostとportが正しいかを確認する。
    • サーバーのファイアウォールやセキュリティ設定も確認が必要です。


エラーコード: 28P01 – Invalid Password

  • 内容:ユーザー名またはパスワードが間違っている。
  • 原因と解決策
    • userとpasswordの指定が正しいか確認する。
    • データベースでそのユーザーの認証方式が正しいかも確認が必要です(pg_hba.confの設定)。


エラーコード: 3D000 – Invalid Catalog Name

  • 内容:指定されたデータベース名が存在しない。
  • 原因と解決策
    • dbnameが正しいかを確認する。
    • データベースが存在すること、または適切なデータベースを指定しているか確認する。


エラーコード: 42501 – Insufficient Privilege

  • 内容:ユーザーに十分な権限がない。
  • 原因と解決策
    • 実行しようとしているクエリに対する権限がユーザーに付与されているか確認する。
    • GRANT文を使用して、必要な権限を付与する。


エラーコード: 42703 – Undefined Column

  • 内容:クエリで指定されたカラムがテーブルに存在しない
  • 原因と解決策
    • SQL文で指定したカラム名が正しいか確認する。
    • カラム名のスペルミスや、引用符の使用なども確認する。


エラーコード: 42P01 – Undefined Table

  • 内容:クエリで指定されたテーブルが存在しない。
  • 原因と解決策
    • テーブル名が正しいかを確認し、テーブルが作成されているかを確認する。
    • スキーマを指定する必要がある場合は、schema.table_nameの形式で記述する。


エラーコード: 23505 – Unique Violation

  • 内容:ユニーク制約違反(既に存在する値をユニークなカラムに挿入しようとした)。
  • 原因と解決策
    • 挿入や更新する値が重複していないか確認する。
    • 重複を防ぐためにデータの事前チェックを行うか、ユニーク制約を取り除く。


エラーコード: 42601 – Syntax Error

  • 内容:SQL文の文法エラー。
  • 原因と解決策
    • SQL文を再度確認し、構文エラーを修正する。
    • 特にクォートやカッコ、カンマの不足・過剰に注意。


エラーコード: 57014 – Query Canceled

  • 内容:クエリが手動またはタイムアウトでキャンセルされた。
  • 原因と解決策
    • クエリが長時間かかっている場合は、クエリの効率化を図る。
    • タイムアウト設定が適切か確認する(例えばstatement_timeoutの設定)。


エラーコード: XX000 – Internal Error

  • 内容:PostgreSQLの内部エラー(未定義のエラー)。
  • 原因と解決策
    • PostgreSQLのバージョンや設定に問題がある可能性があります。
    • ログを確認して問題の詳細を調べ、必要に応じてPostgreSQLを再起動、もしくはアップデートする。


エラーコードを確認し、原因に応じて対処することで、PythonとPostgreSQLの接続と操作が安定します。また、tryとexceptブロックを使ってエラーハンドリングを行い、詳細なエラー情報をログに記録すると、トラブルシューティングが容易になります。

タイトルとURLをコピーしました