ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

Pythonのmodule「psycopg2」を使ってPostgreSQLへ接続する

スポンサードリンク

PostgreSQLがインストールできたので今度はPythonから実行してみる

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1611

$ python -V
Python 3.4.5 :: Anaconda custom (x86_64)

$ psql --version
psql (PostgreSQL) 10.1

psycopg2のインストール

ちょっとだけぐぐってみたけど、PostgreSQLのドライバはこいつが人気らしいのでインストールする

www.ashisuto.co.jp

$ pip install psycopg2

叩いてみる

Pythonインタプリタで遊ぶ

$ python
Python 3.4.5 |Anaconda custom (x86_64)| (default, Jul  2 2016, 17:47:57)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

あ、その前にこんなテーブルが作成されています。

create table sites (
  id bigserial primary key,
  site_name varchar(200) unique,
  created timestamp,
  update timestamp
);
>>> import psycopg2

# DB接続する
>>> conn = psycopg2.connect('dbname=db_name host=localhost user=userpassword=password')

# こいつがよくわからん
>>> cursor = conn.cursor()

# select文を実行
>>> sql = 'select * from example;'
>>> cursor.execute(sql)

# 実行した結果を取得
>>> results = cursor.fetchall()
>>> results
[(1, 'xxxxx', datetime.datetime(2018, 1, 27, 15, 49, 17, 977406), datetime.datetime(2018, 1, 27, 15, 49, 17, 977413)), (3, 'yyyy', datetime.datetime(2018, 1, 27, 15, 49, 55, 199015), datetime.datetime(2018, 1, 27, 15, 49, 55, 199017))]

# placeholder
>>> sql = 'select * from sites where site_name = %s'
>>> cursor.execute(sql, ('xxxxx', ))  # tupleは1つのときは最後にカンマ入れないとNG
>>> results = cursor.fetchall()
>>> results
[(1, 'xxxxx', datetime.datetime(2018, 1, 27, 15, 49, 17, 977406)]

# 数値も%sで良いっぽい
>>> sql = 'select * from sites where id = %s'
>>> cursor.execute(sql, (1,))
>>> results = cursor.fetchall()
>>> results
[(1, 'xxxxx', datetime.datetime(2018, 1, 27, 15, 49, 17, 977406)]

insertとかのデータ処理

トランザクション?が動いているっぽくて、cursorに命令したら実行はconnで実行しなければいけない。

# insert
>>> sql = 'insert into sites (site_name, created, update) values (%s, clock_timestamp(), clock_timestamp());'
>>> cursor.execute(sql, ('zzz',))
>>> conn.commit()

# update
# SQLでダブルクォーテーション使うとダメだった
>>> sql = "update sites set site_name = %s where site_name = 'zzz';"
>>> cursor.execute(sql, ('aaa',))
>>> conn.commit()

# update カラムも更新する
>>> sql = "update sites set site_name = %s, update = clock_timestamp() where site_name = 'aaa';"
>>> cursor.execute(sql, ('zzz',))
>>> conn.commit()

# delete
>>> sql = 'delete from sites where site_name = %s'
>>> cursor.execute(sql, ('zzz',))
>>> conn.commit()

ほい。こんな感じで動きました(ちょっと大変だった