【Python】PostgreSQLを操作する① -DBへの接続

DB

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周りのトラブルを予防していきましょう。

ではでは👋