PostgreSQLを使っているDASHをHerokuにデプロイしようとしたときに出くわしたエラーたち
/ 2 min read
はじめに
PostgreSQLを使っているDASHをHerokuにデプロイしようとしたときに出くわしたエラーたちをご紹介します。
内容
デプロイしたアプリの概要
当初、こんな感じのアプリをデプロイしました。
# app.py
import os
import dash
from dash import html
import pandas as pd
from sqlalchemy import create_engine
# PostgreSQLからdfを取得
engine = create_engine(os.environ['DATABESE\_URL']) # <- エラーその1
df = pd.read_sql(sql='SELECT \* FROM hoge\_table', con=engine)
app = dash.Dash(__name__) # <- エラーその2
app.layout = html.Div([html.P('Hello World!')])
if __name__ == '\_\_main\_\_':
app.run_server(debug=True)
# Procfile
web: gunicorn app:server
エラーその1(sqlalchemy)
「sqlalchemy.exc.NoSuchModuleError: Can’t load plugin: sqlalchemy.dialects:postgres」
現行の sqlalchemy は postgresql://~にしか対応していないそうなのですが、Heroku のデフォルトで設定されている postgresql の環境変数「DATABASE_URL」が postgres://~だったことが原因でした。
そのため、postgres://~で始まる環境変数を新しく作成し、そっちを参照させたところ、うまく行きました。
エラーその2(gunicorn)
「Failed to find attribute ‘server’ in ‘app’.」
gunicorn 上で上記のようなエラーが発生しました。
解決策としては、「app = dash.Dash(__name__)」の直下に「server = app.server」を追加して server を明示すれば OK でした。
# Before
app = dash.Dash(__name__)
# After
app = dash.Dash(__name__)
server = app.server