PostgreSQLはオープンソースのRDBMSです。無料で利用できる故、広く利用されています。PostgreSQLへはPythonからでもアクセスが可能です。Pythonではpsycopg2というパッケージを利用してPostgreSQLへアクセスします。
本記事ではPythonからPostgreSQLへ接続する方法を紹介します。
psycopg2のインストール
まずは自環境にpsycopg2をインストールします。pipの場合は以下の通りです。
pip install psycopg2
condaを利用する場合は以下の通りです。
conda install psycopg2
これで準備はOKです。
Pythonで書く
DBへの接続
ではPythonからDBへ接続してみます。接続にはpsycopg2.connect()を用います。接続情報としてユーザ名、パスワード、ホスト名、ポート、データベース名が必要です。
今回はdvdrentalという名称のデータベースにアクセスする例です。
import psycopg2
connector = psycopg2.connect('postgresql://{user}:{password}@{host}:{port}/{dbname}'.format(
user="postgres", #ユーザ
password="postgresql", #パスワード
host="localhost", #ホスト名
port="5432", #ポート
dbname="dvdrental")) #データベース名
このconnectorはPostgreSQLへの接続情報を持ったオブジェクトです。
In[1]: connector
Out[1]: <connection object at 0x000001E9B4176E10; dsn: 'user=postgres password=xxx
dbname=dvdrental host=localhost port=5432', closed: 1>
これで接続はできました。このあとカーソルを取得します。カーソルとは「検索条件」と「現在位置」を保持して、検索結果を1件ずつ処理していく仕組みのことです。
SELECT version()とすることで、PostgreSQLのバージョン情報を取得できます。cursor.fetchone()でフェッチし、レコード結果を取得します。
cursor = connector.cursor()
cursor.execute("SELECT version();")
result = cursor.fetchone()
print(result[0]+"に接続しています。")
>> PostgreSQL 13.1, compiled by Visual C++ build 1914, 64-bitに接続しています。
SELECT文で検索してみる
カーソルまで作成したところで、実際にテーブルからデータを取得してみます。
今回はcityテーブルから全件取得し、fetchone()で1件分のみ処理します。SQLはcursor.execute()の引数として文字列で渡します。
cursor.execute('SELECT * FROM city')
row = cursor.fetchone()
print(row)
>>(1, 'A Corua (La Corua)', 87, datetime.datetime(2006, 2, 15, 9, 45, 25))
エラー対策
DBに絡む処理にエラーはつきものです。何の対策もせずプログラムを書くと、思いがけないエラーで処理が止まってしまったりということも起きかねません。なので、try~catchでちゃんとエラーハンドリングをしておくことをオススメします。
psycopg2ではErrorモジュールが提供されています。
サンプルコードは本記事最後に紹介する全体コードを参考にしてください。
最後はクローズする
DBに接続したオブジェクトは、使い終わったらクローズして明示的に接続を切断します。カーソルおよび接続オブジェクト両方をクローズします。
cursor.close()
connector.close()
コード全体
これまでの内容をまとめたコード全体は以下のようになります。
import psycopg2
from psycopg2 import Error
try:
#接続
connector = psycopg2.connect('postgresql://{user}:{password}@{host}:{port}/{dbname}'.format(
user="postgres", #ユーザ
password="postgresql", #パスワード
host="localhost", #ホスト名
port="5432", #ポート
dbname="dvdrental")) #データベース名
#カーソル取得
cursor = connector.cursor()
cursor.execute("SELECT version();")
result = cursor.fetchone()
print(result[0]+"に接続しています。")
cursor.execute('SELECT * FROM city')
row = cursor.fetchone()
print(row)
except(Exception, Error) as error:
print("PostgreSQLへの接続時のエラーが発生しました",error)
#最後は必ずクローズ
finally:
cursor.close()
connector.close()
DBについてより学ぶ
データベース、SQLについて、書籍を通してより深く知ることができます。ネットでも情報は手に入りますが、書籍も是非検討してみてください^^
まとめ
psycopg2を使ってPythonからPostgreSQLに接続する方法を紹介しました。PythonからDBへ接続したい場面は結構あると思います。エラーハンドリング含め、適切な処理をすることでDB周りのトラブルを予防していきましょう。
ではでは👋