概要
PythonからPostgreSQLを参照する。
環境
- Python 3.6.6
- PostgreSQL 10
- pg8000 1.12.2
- atom-runner 2.7.1
詳細
インストール
- Python, PostgreSQLのインストールは割愛
- pg8000はpipでインストール
pip install pg8000
condaからは新しいバージョンのパッケージをインストールできなかった……。
テーブル
デモコードで使用するテーブルを作成しておく
id (int) | name (varchar) | yomigana(varchar) | birth_place(char) |
---|---|---|---|
1 | 洲崎 綾 | すざき あや | 石川県 |
2 | 西 明日香 | にし あすか | 兵庫県 |
デモコード
インポート
import pg8000
コネクション生成
接続情報を渡してコネクションオブジェクトを生成する。
渡す情報の種類とキーワードは以下の通り。
pg8000.connect(user, host='localhost', unix_sock=None, port=5432, database=None, password=None, ssl=False, timeout=None, application_name=None)
デモではlocalhost:5432
のDBにアクセスするので以下のように設定。
conn = pg8000.connect(user='postgres', password='***', database='kurukuruz1')
カーソル生成
コネクションオブジェクトからカーソルオブジェクトを生成する。
cur = conn.cursor()
コネクションオブジェクトはDBとの物理接続を表し、トランザクション管理を行う。
カーソルオブジェクトはフェッチ操作のコンテキストを管理する。
全レコード取得
カーソルオブジェクトを介してselect文の発行し、結果を受け取る。
cur.execute('SELECT * from actors')
results = cur.fetchall()
for row in results:
id, name, yomigana, birth_place = row
print(id)
print(name)
print(yomigana)
print(birth_place)
↓実行結果
1
洲崎 綾
すざき あや
石川県
2
西 明日香
にし あすか
兵庫県
クエリへのバインディング
いくつかのバインド記法が用意されており、pg8000.paramstyle
で設定されている。
今回はJavaのPreparedStatement風に?
にバインドするために、以下のように設定を変更する。
pg8000.paramstyle = 'qmark'
バインドするパラメータはexecute時にクエリとともに渡す。
cur.execute('SELECT * from actors where name = ?', ('洲崎 綾',))
results = cur.fetchall()
for row in results:
id, name, yomigana, birth_place = row
print(id)
print(name)
print(yomigana)
print(birth_place)
↓実行結果
1
洲崎 綾
すざき あや
石川県
参考サイト
- PythonからPostgreSQLに接続する方法 _ アシスト.html
- GitHub - mfenniak_pg8000_ A Pure-Python PostgreSQL Driver
- PEP 249 -- Python Database API Specification v2.0 | Python.org
おまけ
atom-runnerをそのまま使うと2バイト文字がエラーになるので文字コード設定を追加する。