今回はPythonからPostgreSQLデータベースに接続し、データを更新したり取得する方法について解説します。
PostgreSQL は無料で使える本格的なデータベースであり、商用利用も盛んにされていますので、仕事で必要に迫られるケースも多いと思います。
PostgreSQL データベースに関して基本的な知識があり、Pythonから接続する方法を知りたいという方が対象の記事になっています。
接続する前の準備
Python から PostgreSQL に接続するには、次の手順が必要です。
- psycopg2パッケージのインストール
- Pythonプログラム上で psycopg2のインポート
尚、psycopg2のパッケージは、他の開発ツールのインストールによって、既にインストール済みの場合があります。
pyodbc のインストール
Python公式サイトからPythonをダウンロードして使っている方は、DOSプロンプトから下記コマンドを実行します。
pip install psycopg2
AnacondaやMinicondaでPythonをインストールして使っている方DOSプロンプトから下記コマンドを実行します。
conda install psycopg2
上記でインストールできない場合は、psycopg2 の公式サイト から whl をダウンロードし、pip コマンドでインストールします。
2024年6月現在では、下記のパッケージ(64ビット版)が最新です。
psycopg2-2.9.9-cp**-cp**-win_amd64.whl
** の部分は対応しているPythonのバージョンですが、自分が使っているPythonのバージョンより下のバージョン(例えばPythonが3.9なら、psycopy2は3.9,3.8,3.7,3.6)なら、どれを選んでも接続できるようです。
ダウンロードしたら、pip install ファイル名 でインストールします。
例えば、 C:\Downloads にダウンロードした場合、次の様になります。
pip install C:\Downloads\psycopg2-2.9.9-cp312-cp312-win_amd64.whl
PostgreSQLに接続し、SQLを実行するための手順
SQLやDDLを実行するための手順は、SQLite、MySQL、Oracle など多くのデータベースと同様です。
1 |
import psycopg2 |
PostgreSQL への接続
PostgreSQL に接続するためには、下記の仕様で接続文字列を作成し、connectメソッドに渡す必要があります。
host='xxx' port=xxx dbname=xxx user=xxx password='xxx'
XXXの部分は、 サーバー名、ポート番号 、データベース名、ユーザー名、パスワードに置き換える必要があります。
例えば、 サーバー名='myserver'、ポート番号=5432、データベース名='mydatabase'、ユーザーID='yamada'、パスワード='hoge1234' の場合は次のようになります。
host='myserver' port=5432 dbname=mydatabas user=yamada password='hoge1234'
ちなみに、 PostgreSQL のデフォルトのポートは 5432になります。
接続文字列が完成したら、connect メソッドの引数に指定することで、PostgreSQL に接続出来るようになります。
1 2 3 4 |
#PostgreSQL接続のサンプル import psycopg2 constr = "host='myserver' port=5432 dbname=mydatabas user=yamada password='hoge1234'" conn = psycopg2.connect(constr) |
データの取得
PostgreSQL に対して select 文を発行し、データを取得する方法は次のようになります。
fetch には次の3種類が用意されていますので、状況に応じて使い分けて下さい。
機能 | メソッド | 備考 |
---|---|---|
全件取得 | fetchall() | リスト形式で全件を返す。 |
1件づつ取得 | fatchone() | データがあれば1行をタプル形式で返す。 データが無くなれば None を返す。 |
指定件数づつ取得 | fetchmeny(件数) |
下記は PostgreSQL に接続し、条件に一致したデータを全件取得するサンプルです。
1 2 3 4 5 6 7 8 9 10 |
import psycopg2 constr = "host='myserver' port=5432 dbname=mydatabas user=yamada password='hoge1234'" conn = psycopg2.connect(constr) cur = conn.cursor() cur.execute('select * from hoge where id >= 10000') res = cur.fetchall() print(res) cur.close() conn.close() |
データの更新、DDLの実行
データの更新やDDLの実行は次のようになります。
トランザクションについては、最初のSQL実行時に自動で開始されますので、特に明記する必要はありませんが、何らかの事情で明示的に記述が必要な場合、conn.begin() と記述します。
また、トランザクションを確定させるには conn.commit() 、トランザクションを無効にしたい場合には conn.rollback() メソッドを呼び出します。
DDLはロールバックが出来ないため、commit() は不要ですが、commit() をしても特にエラーにはなりません。
下記はinsertのサンプルです。
1 2 3 4 5 6 7 8 9 10 11 |
import psycopg2 constr = "host='myserver' port=5432 dbname=mydatabas user=yamada password='hoge1234'" conn = psycopg2.connect(constr) cur = conn.cursor() cur.execute('insert into hoge(id,tag,cost) values('10001','ABCD',120)' cur.execute('insert into hoge(id,tag,cost) values('10002','BCDE',250)' cur.execute('insert into hoge(id,tag,cost) values('10003','CDEF',380)' conn.commit() cur.close() conn.close() |
下記はDDLのサンプルです。
1 2 3 4 5 6 7 8 |
import psycopg2 constr = "host='myserver' port=5432 dbname=mydatabas user=yamada password='hoge1234'" conn = psycopg2.connect(constr) cur = conn.cursor() cur.execute('create table mage(startday timestamp,item varchar2(100),val number(10,2))') cur.close() conn.close() |
PostgreSQLで使える便利なクラスや書き方の紹介
ここまでの記事を通して、psycopg2を使ってPostgreSQLへアクセスするための方法は理解していただけたかと思います。とはいうものの、実際にPostgreSQLに接続して検索や更新を行おうとすると、どう書けばよいのか悩んでしまう方も多いかもしれません。
そこで、PythonからPostgreSQLを簡単に扱うためのクラスを用意しました。また、InsertとUpdateをまとめて行えるUpsertや、複数のInsertを1回で実行する方法なども別記事で用意しました。下記のリンクからジャンプできますので、興味のある方はご一読ください。
【 コピペでOK】9割の機能を網羅!PythonからPostgreSQLを扱うクラスを作ってみました。 |
【詳しく解説】PostgreSQLにおけるUpsertの書き方(サンプル付き) |
PostgreSQLに1回のinsertで複数データ登録 by Python |
PostgreSQLのストアドプロシージャについても、下記の記事で詳しく解説しています。
まとめ
今回は Python を使って PostgreSQL に接続するために必要なpsycopg2のインストール方法 と、PostgreSQL に接続した後にデータの抽出や更新を行うための簡単なサンプルを紹介しまた。
Pythonのデータベース接続は、データベースの種類によってコネクションの部分が多少異なるものの、接続してしまえば後の手順(データ抽出、データ更新、DDL発行)は同じです。
この記事がPythonで PostgreSQL に接続するための参考になれば幸いです。
コメント