MotoJapan's Tech-Memo

技術めも

【Linebot #1】windows8.1(local)とherokuでpostgreSQL環境構築 (psycopg2)

Linebotを最近書いているのですが、そろそろオウム返しbotだけだとつまらないので、データベースを組み込みたいなと。
もともとsqlite3を使っていたのですが、Herokuはsqliteが簡単に使えないことをdeploy時に気づき、やむなくpostgres対応を考えることに。。


そこまでの手順とハマったことの覚書です。

手順は次です。

1. ローカルのwindows環境でpostgresをインストール・動作確認
2. heroku環境でpostgresをAddon追加・動作確認

1. ローカルのwindows環境でpostgresをインストール・動作確認

まず動作確認用のローカル環境を準備

1.1. windowsにpostgresをダウンロード・インストー

v 9.6.3-2を下記よりダウンロード

(あっという間に9系が主流みたいですね、pgadminも入っているし)

http://www.postgresql.org/

★インストール最終段階で「Database Cluster Initialization Failed」がでて失敗

対策:PostgreSQLのインストーディレクトリにフルコントロールを与える

これで無事インストールできました。(めでたしめでたし)

1.2. pythonから実行するためのモジュール(psycopg2)をインストー

次でインストー

>pip install psycopg2

動作確認

>python
Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar  6 2015, 12:06:10) [MSC v.1
600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>>

エラーなしでOK!
たった手順2つで簡単に環境が揃いました。
あとは、psycopg2のAPIで接続やテーブル作成してみて動いていることを確認。

2. heroku環境でpostgresをAddon追加・動作確認

実はherokuでのpostgres環境構築は、windows環境よりはるかに楽でした。
(というかwindows側いらなかったと反省、インストールも早いし)

やることは、「herokuアプリケーションに heroku-postgresql Addonを追加」する。

herokuはpostgresをaddonとして対応(無料)しているのでこれを使う。
しかもheroku-postgresqlはherokuと独立したインスタンスを提供されます。
なので、ローカルで動作確認したい場合は、上記1.1で飛ばして、ローカルからpsycopg2で接続すればおk!

2.1. heroku-postgresql Addonの確認

確認方法1 (GUI)
https://dashboard.heroku.com/apps/application_id/resources
※application_idは自分のlinebotをdeployしているアプリケーションID
ここにheroku-postgresql Addonがあるか確認

確認方法2 (CUI)

>heroku addons --app <application_id>

無ければ次へ。

2.2. heroku-postgresql Addonの追加

>heroku addons:add heroku-postgresql --app <application_id>

下図のように、https://dashboard.heroku.com/apps/application_id/resourcesに追加されています。

f:id:motojapan:20170709165719p:plain

2.3. heroku-postgresql Addonの設定取得

>heroku config --app <application_id>
DATABASE_URL:              postgres://aaaa:bbbb@cccc:dddd/eeee
LINE_CHANNEL_ACCESS_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxx
LINE_CHANNEL_SECRET:       yyyyyyyyyyyyyyyyyyyyyyyyyyy

今回重要なのは、[DATABASE_URL]説明は次の通りです。

aaaa user_name
bbbb password
cccc server_name (私の環境はawsの模様)
dddd port
eeee database_name

psycopg2での接続は次のような対応になります。

import psycopg2
user   = aaaa
pwd    = bbbb
server = cccc
port   = dddd
db     = eeee        
con = psycopg2.connect("host=" + server + " port=" + port + " dbname=" + db + " user=" + user + " password=" + pwd)

なので、ローカル環境でもdeploy先のherokuでも上記で繋げばOKです。