Flask の移行を処理するために Alembic を使用しています。alembic revision --autogenerate
理論的には、データベースの変更に基づいて移行を自動生成する必要があります。ただし、Alembic は上記のコマンドで空の移行を生成しているだけです。
this one に非常によく似た質問があります。問題は、適切なモデルがインポートされていないことでした。ただし、次のように、Flask アプリからモデルをインポートしましたenv.py
。
...
# import settings from Flask
alembic_config = config.get_section(config.config_ini_section)
from start import app
from models import User, Item, Recipient # models are imported here from models.py
alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI']
engine = engine_from_config(
alembic_config, # config.get_section(config.config_ini_section)
prefix='sqlalchemy.',
poolclass=pool.NullPool)
...
インポートされたdbメタデータと同様にenv.py
(「開始」はFlaskアプリのメインファイルの名前です):
...
from start import db
target_metadata = db.metadata
...
その後、実行alembic revision --autogenerate -m "initial_rev"
すると空の移行が生成されますが、Flask アプリは異なります。
"""initial_rev
Revision ID: 45296fd29540
Revises: None
Create Date: 2013-06-19 17:32:38.392268
"""
# revision identifiers, used by Alembic.
revision = '45296fd29540'
down_revision = None
from alembic import op
import sqlalchemy as sa
def upgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
編集
これは、私のアプリのファイル構造といくつかの追加コードを示す要点です。問題は、Alembic が でdatabase.py
最初に初期化せずにdb をインポートすることを好まないこと__init__.py
です。ただし、青写真が使用されている場合(循環的なインポートのため) 、これは不可能です。
問題は、Flask ブループリントも使用する場合、Alembic をどのように使用できるかということです。
編集#2
db.metadata.sorted_tables
データベースのメタデータが正しくインポートされていることを確認するために、印刷も試みました。案の定、データベース スキーマ全体が端末にパイプされました。では、なぜ Alembic は空白のアップグレード/ダウングレード機能を生成するのでしょうか?
編集 #3
db.init_app(app)
この問題はとの違いに関係があると結論付けましたが、db = SQLAlchemy(app)
何が問題を引き起こしているのかよくわかりません。この理論をテストするために、 を に置き換えfrom database import db
ましenv.py
たdb = SQLAlchemy(app)
。おそらく悪い考えですが、デバッグ目的で何が起こるかを見たかったのです。
Alembic が自動生成し、upgrade() および downgrade() メソッドを埋めましたが、逆になっていました! 適切な列とメタデータをすべて使用して作成しupgrade()
ながら、3 つのテーブルすべてを削除しました。downgrade()
これがなぜなのかはわかりませんが、この問題を理解しようとしている人々に役立つことを願っています.