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のドライバはこいつが人気らしいのでインストールする
$ pip install psycopg2
叩いてみる
$ 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()
ほい。こんな感じで動きました(ちょっと大変だった