概要
Flaskのデータベースを作成する際に、「flask db init」コマンドでImportErrorが発生し、migrationsファイルが作成されなかったため、いろいろ試したことをメモ。
バージョン
flask==1.1.1
flask-sqlalchemy==2.4.3
flask-migrate==2.5.3
flask-login==0.5.0
flask-bcrypt==0.7.1
wtforms==2.3.1
email-validator==1.1.1
内容
set FLASK_APP=setup.py
からのflask db init
時に
ImportError: cannot import name 'escape' from 'jinja2'
というエラーが発生しました。
調べた所、Flaskのv1系はescapeモジュールが利用できないらしいです。
そのため、flask==2.2.3
に更新しました。
すると、別のエラーが発生。
ModuleNotFoundError: No module named 'flask.ext'
こちらは、flask.ext.sqlalchemy
が古い形で既にサポートされていない為flask_sqlalchemy
に変更する必要がありました。
次のエラー。
AttributeError: module 'time' has no attribute 'clock'
time.clock()
はPython3.6以降では削除されたらしいです。
なので、代わりにtime.perf_counter()
を利用します。
またまたエラー。。。
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security'
このエラーに関してはwergzeugのv2.1.0リリースノートによると、safe_str_cmp
が削除されたため、利用できないとの事でした。
そのため、代替手段としてhmac
を利用しました。
次が最後のエラーです。。。
AttributeError: module 'sqlalchemy' has no attribute '__all__'. Did you mean: '__file__'?
https://teratail.com/questions/pmg713u6e7onk1 によると、SQLalchemyのv2系で起こるエラーのようで、解決方法としてはv3系にアップグレードするか、v1系にダウングレードするらしいです。
ただ、v1系だと依存関係でエラーが発生してしまう為、flask-sqlalchemy==3.0.3
に更新しました。
最終的なバージョン
flask==2.2.3
flask-sqlalchemy==3.0.3
flask-migrate==2.5.3
flask-login==0.5.0
flask-bcrypt==0.7.1
wtforms==2.3.1
email-validator==1.1.1
werkzeug==2.2.3
jinja2==3.0.3
だらだら書いたせいで、読みにくくなってしまい申し訳ないですが、一人でもこの記事を見て解決してくれたら嬉しいです。