「お手軽に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.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年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の動作確認を説明しました。