skip to content
barorin&?

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