Herokuのデータベースにカラムを追加しようとしたらエラーになった原因
原因1.環境変数の設定をしていない
Herokuのデータベースをアップグレードしようとしたら、以下のエラーが出ました。
これは「Flaskアプリケーションが見つからない」と出ています。

flask db upgradeコマンドを実行した際に、接続情報などを取得する必要があります。それらはFlaskアプリケーションの設定から取得します。
flask db upgrade を実行
↓
FLASK_APP環境変数を確認
↓
myapp:app を読み込む
↓
Flaskアプリケーションを起動
↓
app.config['SQLALCHEMY_DATABASE_URI'] を取得
↓
データベースに接続
↓
マイグレーション実行
原因2.Herokuへ最初にデプロイした際にマイグレーションをしていない
ローカルではデータベースを更新するたびにマイグレーションファイルを作成していたが、Herokuでは一度もマイグレーションしていなかったのでマイグレーション履歴とHerokuのデータベース履歴が一致しておらずエラーになった。
Herokuではalembic_versionテーブルでマイグレーション履歴を記録します。
・最初のデプロイ時にdb.create_all()コマンドでテーブルを作成したので、マイグレーションを使っておらずマイグレーション履歴が記録されていない
↓
・Flask-Migreateは「まだ何もマイグレーションしていない」と判断し、すべてのマイグレーションを最初から実行しようとする
↓
・CREATE TABLE booksを実行し、すでに存在するためエラーになる
Herokuの環境変数設定
flask runコマンドを実行する際、環境変数FLASK_APPにアプリケーション名を設定する必要がある
heroku config:set FLASK_APP=myapp:app
環境変数の設定を確認
heroku config
上記のコマンドを打つとターミナルには以下のように環境変数の設定が表示されます。

マイグレーションを修正
今回はデータベースにnotify_read_completedカラムを追加したい。そのためのマイグレーションファイルがあるか確認します。
- migration > versions > ff13a06d7588(add notify_read_completedが書かれたファイル名)
1. 一つ前にスタンプ
heroku run flask db stamp b848a7faacf5
2. 最新のマイグレーションを適用
heroku run flask db upgrade
3. 確認
heroku run flask db current
headが最新のマイグレーションファイルを指していることが確認できます。
テーブルの中身もちゃんと追加されているか、コマンドで確認します。
heroku pg:psql
\d users
今回はusersテーブルにnotify_read_completedカラムを追加しています。
学んだこと
今回Herokuのデータベースをdb.create_all()で作成したため、マイグレーションの履歴が残らずテーブル構造の変更履歴が追跡できない状態になっていました。そのためflask db upgradeコマンドを実行した際に一からテーブルを作成しようとしてエラーになりました。
本番環境でデータベースを作成する際は、マイグレーションを使用して変更管理をする重要性を学びました。
また、ローカルでも環境変数を設定したように、本番環境でも環境変数の設定が必要なことを学びました。

