明けましておめでとうございます。
2022年の最初の投稿になります、ヒノマルクです。
前回投稿した日から暫く経ってしまいました。
PythonからPostgreSQLにアクセスできるようにしようと思います。
Psycopgについて
今回はPsycopgというライブラリを使ってPostgreSQLにアクセスできるようにします。
詳細のインストール方法は下記に記載されています。
SQLAlchemyの紹介
PostgreSQLにつなぐことができるライブラリは他には
SQLAlchemyというものもあります。
SQLAlchemyはObject Relational Mapping (ORM) と言われるライブラリになります。ORMは主にシステム開発で利用されているかと思います。SQLを書けなくてもSQLAlchemyのメソッドを使ってDB操作をすることが出来るのがポイントになります。
SQLAlchemy内でpsycopg2やcx_Oracleなどのライブラリを読み込んでSQLAlchemyの記述方法で統一することによって異なるDBへのアクセスでも同じコードで操作することを可能にしてくれています。
複数のライブラリを使い分けるのが面倒な方はSQLAlchemyをインストールすることをおすすめします。
SQLAlchemyの使い方はいつか記事にしようと思います。
しかしヒノマルクはSQLでの記述が主体で、ORMよりは慣れているので、psycopg2を利用しています。
Psycopg2のインストール
Mac環境での動作を想定しています。
Linux環境で用意する方法はまた別記事にしようと思います。
よくpsycopg-binaryで環境を準備している記事を見かけます。
お試しで動かす程度でしたらいいのですが、Production環境では非推奨*1のようです。
また、wheelでのインストールもlibsslがコンフリクトを起こす可能性*1があるので、ソースからビルドすることを公式ではおすすめされています。
Psycopg2をソースからビルドする
$ export PATH=/Applications/Postgres.app/Contents/Versions/14/bin/:$PATH
ヒノマルクはMacのPostgres.appでpostgreSQL環境を構築していますので、上記がpg_configへのパスになります。
$ /Users/hinomaruc/Desktop/notebooks/my-venv/bin/python3 -m pip install --no-binary :all: psycopg2
Collecting psycopg2 Downloading psycopg2-2.9.3.tar.gz (380 kB) |████████████████████████████████| 380 kB 3.3 MB/s Preparing metadata (setup.py) ... done Skipping wheel build for psycopg2, due to binaries being disabled for it. Installing collected packages: psycopg2 Running setup.py install for psycopg2 ... done Successfully installed psycopg2-2.9.3
GitHub もしくは PyPIにPsycopg2のソースがアップされています。
今回はPyPIからソースをビルドしました。
PythonでPsycopg2を使ってみる
# https://www.psycopg.org/docs/module.html
import psycopg2
# https://www.psycopg.org/docs/connection.html
conn = psycopg2.connect("dbname=postgres user=postgres password=secret host=localhost port=5432")
# https://www.psycopg.org/docs/cursor.html
cur = conn.cursor()
cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")
cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",(100, "abc'def"))
cur.execute("SELECT * FROM test;")
cur.fetchone()
(1, 100, "abc'def")
conn.commit()
# Close communication with the database
cur.close()
conn.close()
実業務だとデータベースからpandasにデータを読み込んで処理をすることが多いと思うので、そちらも記事化しようと思っています。