【Pure-Python】PostgreSQL接続ライブラリpg8000

【Pure-Python】PostgreSQL接続ライブラリpg8000 プログラミング

「お手軽にPythonからPostgreSQLにアクセスしたい」
「psycopg2のインストールが失敗してしまう・・・」

このような場合には、pg8000がオススメです。
この記事では、pg8000について解説しています。

本記事の内容

  • pg8000とは?
  • pg8000のシステム要件
  • pg8000のインストール
  • pg8000の動作確認

それでは、上記に沿って解説していきます。

pg8000とは?

pg8000は、PostgreSQLへのPure-Pythonインタフェースです。
100%Pythonで書かれたPythonライブラリになります。

このPythonだけで書かれたというのが、pg8000の最も大きな特徴です。
通常は、外部ライブラリ(libpqライブラリなど)に依存します。

例えば、psycopg2がその代表的なモノとなります。

psycopg2は、libpq(PostgreSQL client library)に依存しています。
だからこそ、psycopg2は速度的にメリットがあります。

しかし、psycopg2のインストールにはビルドが欠かせません。
そのため、psycopg2のインストールは容易ではないのです。

実際、結構な頻度でpsycopg2のインストールに失敗します。
そのため、バイナリ版のインストールで補うことになりがちです。

それとは逆に、pg8000のインストールは失敗することは皆無でしょう。
Pythonだけで書かれているなら、基本的には問題は生じないはずです。

速度を考えたら、psycopg2が推奨されるでしょう。
導入の手軽さを求めるなら、pg8000がオススメと言えます。

以上、pg8000について説明しました。
次は、pg8000のシステム要件を説明します。

pg8000のシステム要件

現時点(2022年7月)でのpg8000の最新バージョンは、1.29.1となります。
この最新バージョンは、2022年5月23日にリリースされています。

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

サポート対象となるPythonのバージョンは、以下となっています。

  • Python 3.7
  • Python 3.8
  • Python 3.9
  • Python 3.10

このサポート状況は、以下のPython公式開発サイクルに一致しています。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年10月4日2026年10月

これは、pg8000のメンテナンスが行き届いていることの証拠です。
この点より、pg8000は安心できるライブラリと言えます。

実際、多くのライブラリはこの辺を適当にしてしまっています。
サポートの切れたPython 3.6をずっと対象にしたままというのは、結構目にします。

まとめると、pg8000のシステム要件はPython 3.7以降だけですね。
それ以外に必要なモノはありません。

以上、pg8000のシステム要件を説明しました。
次は、pg8000のインストールを説明します。

pg8000のインストール

検証は、次のバージョンのPythonで行います。

$ python -V
Python 3.10.2

まずは、現状のインストール済みパッケージを確認しておきます。

$ pip list
Package    Version
---------- -------
pip        22.1.2
setuptools 63.1.0
wheel      0.36.2

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、pg8000のインストールです。
pg8000のインストールは、以下のコマンドとなります。

pip install pg8000

pg8000のインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。

$ pip list
Package    Version
---------- -------
asn1crypto 1.5.1
pg8000     1.29.1
pip        22.1.2
scramp     1.4.1
setuptools 63.1.0
wheel      0.36.2

依存するパッケージは、asn1cryptoとscrampの2つです。
これであれば、既存環境へは影響をほとんど与えずにpg8000を導入できます。

以上、pg8000のインストールを説明しました。
次は、pg8000の動作確認を説明します。

pg8000の動作確認

pg8000の動作確認を行います。
テーブルにあるデータを照会する動作を確認してみましょう。

その際には、次のサンプルデータベースを利用します。

テーブルは、以下を利用します。

このテーブル(category)には、全部で16件のデータが登録されています。

dvdrental=# select * from category;
 category_id |    name     |     last_update     
-------------+-------------+---------------------
           1 | Action      | 2006-02-15 09:46:27
           2 | Animation   | 2006-02-15 09:46:27
           3 | Children    | 2006-02-15 09:46:27
           4 | Classics    | 2006-02-15 09:46:27
           5 | Comedy      | 2006-02-15 09:46:27
           6 | Documentary | 2006-02-15 09:46:27
           7 | Drama       | 2006-02-15 09:46:27
           8 | Family      | 2006-02-15 09:46:27
           9 | Foreign     | 2006-02-15 09:46:27
          10 | Games       | 2006-02-15 09:46:27
          11 | Horror      | 2006-02-15 09:46:27
          12 | Music       | 2006-02-15 09:46:27
          13 | New         | 2006-02-15 09:46:27
          14 | Sci-Fi      | 2006-02-15 09:46:27
          15 | Sports      | 2006-02-15 09:46:27
          16 | Travel      | 2006-02-15 09:46:27
(16 rows)

pg8000には、次の2つのAPIが存在しています。

  • ネイティブなpg8000 API
  • DB-API 2.0標準API

それぞれを用いた動作を以下で説明します。

ネイティブなpg8000 API

接続情報は、各自の環境に合わせてください。

import pg8000.native

con = pg8000.native.Connection(
    host="localhost",
    port="5432",
    user="postgres",
    password="postgres",
    database="dvdrental")

result = con.run("SELECT category_id, name FROM category ORDER BY category_id LIMIT 3")
for target in result:
    print(target[0], target[1])

con.close()

上記コードを実行した結果は、以下。

1 Action
2 Animation
3 Children

categoryteテーブルから、idで昇順ソートした上位3つを取得できています。
問題ありませんね。

DB-API 2.0標準API

同じく、接続情報は適宜変更してください。

import pg8000.dbapi

con = pg8000.dbapi.connect(
    host="localhost",
    port="5432",
    user="postgres",
    password="postgres",
    database="dvdrental")

cursor = con.cursor()

cursor.execute("SELECT category_id, name FROM category ORDER BY category_id LIMIT 3")
result = cursor.fetchall()
for target in result:
    print(target[0], target[1])

con.close()

カーソルが出てきて、fetchしてという形ですね。
確かに、この形はよく見ます。

上記コードを実行した結果は、ネイティブなpg8000 APIと同じです。

1 Action
2 Animation
3 Children

以上、pg8000の動作確認を説明しました。

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