「個人情報漏えいを防ぎたい」
「SQLインジェクション対策を実施したい」
「PythonでPostgreSQLをORMにより操作したい」
このような場合には、この記事の内容が参考になります。
この記事では、PythonでPostgreSQLをORM操作する方法を解説しています。
本記事の内容
- SQLAlchemyによるPostgreSQLのORM操作
- 動作確認のための準備
- pg8000によるデータ取得
- SQLAlchemy(pg8000を内部で利用)によるデータ取得
それでは、上記に沿って解説していきます。
SQLAlchemyによるPostgreSQLのORM操作
SQLAlchemyは、PythonでデータベースをORM操作するライブラリです。
ただし、SQLAlchemyはあくまでORMライブラリに過ぎません。
SQLAlchemyのインストールについては、次の記事で説明しています。
このSQLAlchemyに加えて、PostgreSQL用のドライバーが必要となります。
今回は、そのドライバーにpg8000を利用します。
pg8000については、次の記事で説明しています。
以上、SQLAlchemyによるPostgreSQLのORM操作を説明しました。
次は、動作確認のための準備を説明します。
動作確認のための準備
PostgreSQLには、サンプルデータベースが用意されています。
このサンプルデータベースを用いて、動作確認を行います。
具体的には、次のテーブルからデータを取得する動作を確認します。

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によるデータ取得を説明します。
pg8000によるデータ取得
pg8000によるデータ取得を確認します。
pg8000には、次の2つのAPIが存在しています。
- ネイティブなpg8000 API
- DB-API 2.0標準API
それぞれのコードを載せておきます。
DB接続のための情報は、各自の環境に合わせて変更してください。
ネイティブな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()
DB-API 2.0標準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()
上位3件(category_idの昇順)をSELECTするSQL文を実行しています。
それぞれのコードを実行した結果は、以下。
1 Action 2 Animation 3 Children
両方のコードとも、全く同じ結果となります。
以上、pg8000によるデータ取得を説明しました。
次は、SQLAlchemy(pg8000を内部で利用)によるデータ取得を説明します。
SQLAlchemy(pg8000を内部で利用)によるデータ取得
SQLAlchemyによるORM操作の場合は、次のコードを用います。
こちらも設定は、各自の環境に合わせてください。
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
DATABASE = 'postgresql+pg8000'
USER = 'postgres'
PASSWORD = 'postgres'
HOST = 'localhost'
PORT = '5432'
DB_NAME = 'dvdrental'
CONNECT_STR = '{}://{}:{}@{}:{}/{}'.format(DATABASE, USER, PASSWORD, HOST, PORT, DB_NAME)
Base = declarative_base()
class Category(Base):
category_id = Column(Integer, primary_key=True)
name = Column(String(length=25))
__tablename__ = 'category'
engine = sqlalchemy.create_engine(CONNECT_STR, echo=False)
session = sessionmaker(bind=engine)()
query_result = session.query(Category).order_by(Category.category_id).limit(3)
for target in query_result:
print(target.category_id, target.name)
Categoryクラスは、categoryテーブルをもとに作成しています。
また、今回はドライバーにpg8000を利用します。
そのことは、次の箇所で設定しています。
DATABASE = 'postgresql+pg8000'
pg8000以外のドライバーを用いるなら、そのドライバー名を指定します。
なお、ドライバーを指定しない場合は、psycopg2を利用する設定になります。
上記コードを実行した結果は、以下。
1 Action 2 Animation 3 Children
pg8000のみを用いて取得した結果と同じです。
以上、SQLAlchemy(pg8000を内部で利用)によるデータ取得を説明しました。




