読者です 読者をやめる 読者になる 読者になる

haruka's Desk

技術系の備忘録

herokuにアップしたTornadoでPostgreSQLを使う

herokuでPostgreSQLを使うのが意外と面倒だったので、残しておきます。

アドオンの追加

$ heroku addons:create heroku-postgresql:hobby-dev

このとき、出力されるCreated postgresql-[文字列]-[数字] as DATABASE_URLのpostgresql-[文字列]-[数字]を用いて以下のコマンドで対応させます。

DBの対応付け

$ heroku pg:promote postgresql-[文字列]-[数字]

ローカルDBのアップロード

herokuのダッシュボードを開き、アップ済みのアプリケーションの管理ページを開きます。

herokuダッシュボード

f:id:krulcifer-einfolk-fafnir:20160909151933p:plain
今回はpure-beach-70140になりました。

管理画面

f:id:krulcifer-einfolk-fafnir:20160909151937p:plain
Resourcesを押します。
f:id:krulcifer-einfolk-fafnir:20160909151940p:plain
このとき、カラーがRedとなっているため

$ PGUSER=PostgreSQLのユーザー名 PGPASSWORD=パスワード heroku pg:push データベース名 HEROKU_POSTGRESQL_RED_URL

とすることで、ローカルのDBが持つデータをアップすることができます。
※Brown等他のカラーの場合はHEROKU_POSTGRESQL_COLOR_URLのCOLORをその都度変更します。

Tornado内で呼び出し

まず、モジュールをインポートします。

import urlparse
import psycopg2
import psycopg2.extras

Applicationクラスの__init__に以下のコードを追加します。

urlparse.uses_netloc.append("postgres")
url = urlparse.urlparse(os.environ.get("DATABASE_URL",'postgresql://ユーザー名@localhost/データベース名'))
        self.conn = psycopg2.connect(
            database=url.path[1:],
    	    user=url.username,
    	    password=url.password,
    	    host=url.hostname,
            port=url.port
    	) 

以下のコードで呼び出せます。

conn = self.application.conn 
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("select * from test;")