コスギデンサン >> 情報系メモ >> Python

Python - PostgreSQL(Psycopg)メモ - SELECTしてみる 2017/4
Version 3.6.1 on CentOS7

単純なSELECT 使用するテーブル
import psycopg2

constr = "host=localhost port=5432 dbname=dbname user=user password=password"
conn = psycopg2.connect(constr)

sql = "SELECT * FROM t_yubin_bango LIMIT 10"
cur = conn.cursor()
print(cur)

cur.execute(sql)
for row in cur:
    print(row)

con.close()
<cursor object at 0x7f2756682900; closed: 0>
('0600000', 'ホッカイドウ', 'サッポロシチュウオウク', ' ', '北海道', '札幌市中央区', ' ')
('0640941', 'ホッカイドウ', 'サッポロシチュウオウク', 'アサヒガオカ', '北海道', '札幌市中央区', '旭ケ丘')
('0600041', 'ホッカイドウ', 'サッポロシチュウオウク', 'オオドオリヒガシ', '北海道', '札幌市中央区', '大通東')
('0600042', 'ホッカイドウ', 'サッポロシチュウオウク', 'オオドオリニシ(1-19チョウメ)', '北海道', '札幌市中央区', '大通西 (1~19丁目)')
('0640820', 'ホッカイドウ', 'サッポロシチュウオウク', 'オオドオリニシ(20-28チョウメ)', '北海道', '札幌市中央区', '大通西(20~28丁目)')
('0600031', 'ホッカイドウ', 'サッポロシチュウオウク', 'キタ1ジョウヒガシ', '北海道', '札幌市中央区', '北一条東')
('0600001', 'ホッカイドウ', 'サッポロシチュウオウク', 'キタ1ジョウニシ(1-19チョウメ)', '北海道', '札幌市中央区', '北一条西(1~19丁目)')
('0640821', 'ホッカイドウ', 'サッポロシチュウオウク', 'キタ1ジョウニシ(20-28チョウメ)', '北海道', '札幌市中央区', '北一 条西(20~28丁目)')
('0600032', 'ホッカイドウ', 'サッポロシチュウオウク', 'キタ2ジョウヒガシ', '北海道', '札幌市中央区', '北二条東')
('0600002', 'ホッカイドウ', 'サッポロシチュウオウク', 'キタ2ジョウニシ(1-19チョウメ)', '北海道', '札幌市中央区', '北二条西(1~19丁目)')
SQLダンプ
BEGIN
SELECT * FROM t_yubin_bango LIMIT 10
※ BEGINが発行されている。

複数回SELECTしてみる
import psycopg2

# SELECTメソッド
def do_select(sql):
    cur.execute(sql)
    for row in cur:
            print(row)

# main
constr = "host=localhost port=5432 dbname=dbname user=user password=password"
conn = psycopg2.connect(constr)

cur = conn.cursor()

# SELECT 1
sql = "SELECT CURRENT_TIMESTAMP"
do_select(sql)
# SELECT 2
sql = "SELECT CURRENT_TIMESTAMP"
do_select(sql)
# SELECT 3
sql = "SELECT CURRENT_TIMESTAMP"
do_select(sql)

conn.close()
(datetime.datetime(2017, 4, 29, 18, 15, 17, 478226, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=540, name=None)),)
(datetime.datetime(2017, 4, 29, 18, 15, 17, 478226, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=540, name=None)),)
(datetime.datetime(2017, 4, 29, 18, 15, 17, 478226, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=540, name=None)),)
SQLダンプ
BEGIN
SELECT CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP
※ 最初のSELECT実行前にBEGINが発行されている。

複数回SELECTの途中でコミットしてみる。
import psycopg2

# SELECTメソッド
def do_select(sql):
    cur.execute(sql)
    for row in cur:
            print(row)

# main
constr = "host=localhost port=5432 dbname=dbname user=user password=password"
conn = psycopg2.connect(constr)

cur = conn.cursor()

# SELECT 1
sql = "SELECT 1"
do_select(sql)
# SELECT 2
sql = "SELECT 2"
do_select(sql)

conn.commit();

# SELECT 3
sql = "SELECT 3"
do_select(sql)

conn.rollback()

conn.close()
(1,)
(2,)
(3,)
SQLダンプ
BEGIN
SELECT 1
SELECT 2
COMMIT
BEGIN
SELECT 2
ROLLBACK

※ 明示的にトランザクションが開始されるので、すぐに終了しないPYTHONプログラムでは、SELECTであってもCOMMITするのが望ましい。
  デフォルト値:AUTOCOMMIT=FALSE
※ デフォルトでは更新系SQLはCOMMITしなければ他のセッションに反映されない。:IDLE状態のPOSTGRESプロセスが消える→ROLLBACK