個人的な趣味レベルのアプリケーションをいちいちAWSやGCPにデプロイするのは結構カロリー高いです。
とにかく思いついた勢いでプロダクトをリリースしたいときに味方になってくれるのがherokuたん。
herokuが公式にサポートしているデータベースはPostgresで「そーなんだ(Postgresようわからん)」「モックだからhereokuでいいか」くらいにしか認識してなかったんですが・・・
よくよく調べたらアドオンがかなり豊富でMySQL使えるやん!
導入も超カンタンということで手のひら返しでお世話になります。
ClearDBアドオンは、ClearDBというherokuとは別のDaaSを組み込んでherokuアプリと連動可能です。
# プランを指定してMySQLを新規作成 $ heroku addons:create cleardb:プラン名 --app アプリ名
herokuの使えるMySQLの無料プラン(ClearDBアドオンのignite)の容量が5MBまで。
料金プランによって容量とかコネクション数が違うんで参考までに。
そのほかのサポート比較は公式へ。
| プラン名 | 月料金 | 容量 | 接続数 |
|---|---|---|---|
| Ignite | 無料 | 5MB | 10 |
| Punch | $9.99/月 | 1GB | 15 |
| Drift | $49.99/月 | 5GB | 30 |
| Scream | $99.99/月 | 10GB | 40 |
| Standard25 | $54.27/月 | 25GB | 10 |
| Standard50 | $108.53/月 | 46.6GB | 20 |
| Standard100 | $217.07/月 | 93.1GB | 40 |
| Standard200 | $434.13/月 | 186GB | 80 |
| Standard400 | $868.26/月 | 373GB | 160 |
| Standard800 | $1736.52/月 | 745GB | 320 |
| Standard1600 | $3473.05/月 | 1.46TB | 640 |
| Premium400 | $876.67/月 | 373GB | 160 |
| Premium800 | $1753.34/月 | 745GB | 320 |
| Premium1600 | $3506.69/月 | 1.46TB | 640 |
| Premium3200 | $7013.38/月 | 2.91TB | 1,280 |
| Premium6400 | $18736.13/月 | 6.25TB | 3,480 |
| Premium12800 | $30392.42/月 | 12.5TB | 7,680 |
$ heroku config | grep CLEARDB --> CLEARDB_COBALT_URL: mysql://username:password@hostname/database_name?reconnect=true
これで作成したデータベースアクセス情報が取得できます。
mysql://ユーザー名:パスワード@ホスト/データベース名?reconnect=true
$ heroku config:set DATABASE_URL='mysql://username:password@hostname/database_name?reconnect=true' --> Setting DATABASE_URL and restarting ⬢ heroku-app-name... done, v76 --> DATABASE_URL: mysql://username:password@hostname/database_name?reconnect=true # cleardbのコンパネページをブラウザで表示 $ heroku addons:open cleardb
herokuと紐づけたMySQLにローカルからも接続したいのでMacユーザーには「Sequel Pro」というGUIツールからも接続できる様に以下の項目を設定して接続します。
herokuコマンドから取得したDB情報をherokuにデプロイするpythonアプリに追加
import pymysql
import pymysql.cursors
connection = pymysql.connect(
host='ホスト',
user='ユーザー名',
password='パスワード',
db='データベース名',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
cursor.execute(sql)
results = cursor.fetchall()
finally:
cursor.close()
connection.close()
