私はAlembicを使用してFlaskのマイグレーションを処理しています。 alembic revision --autogenerate
は、理論上、自分のデータベースの変更に基づいてマイグレーションを自動生成する必要があります。しかし、Alembicは単に上記のコマンドで空白の移行を生成しています。Alembicは空のFlask-SQLAlchemyマイグレーションを自動生成します
question very similar to this oneがあります。ここでは、適切なモデルがインポートされていないという問題がありました。 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)
...
と同様にenv.py
で輸入DBのメタデータを(「開始」を私のフラスコアプリのメインファイルの名前です)
...
from start import db
target_metadata = db.metadata
...
私のフラスコアプリは不賛成だろうが、空の移行を生成し、その後alembic revision --autogenerate -m "initial_rev"
を実行:
"""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がからインポートされたdbを最初に__init__.py
に初期化せずに持っていないことが問題だと思われます。しかし、これは不可能青写真が使用される場合(循環輸入のため)、このSO答えで説明されています:https://stackoverflow.com/a/9695045/353878。
Flaskの青写真が使用されているときには、どうしたらAlembicを使用できますか?
編集#2
私も、データベースのメタデータが正しくインポートされていたことを確認するために、db.metadata.sorted_tables
を印刷してみました。確かに、データベーススキーマ全体が端末にパイプされていました。では、なぜAlembicはブランクのアップグレード/ダウングレード機能を生成していますか?
編集#3
私は問題がdb.init_app(app)
とdb = SQLAlchemy(app)
の違いとは何かを持っていると結論付けましたが、私は問題を引き起こしているものはかなりよく分かりません。この理論をテストするために、env.py
のfrom database import db
をdb = SQLAlchemy(app)
に置き換えました。おそらく悪い考えですが、私はデバッグのために何が起こるのかを見たいと思っていました。
Alembicは、upgrade()およびdowngrade()メソッドを自動生成して埋めましたが、それらは逆でした! upgrade()
はすべてのテーブルを削除しましたが、downgrade()
はすべての適切な列とメタデータでテーブルを作成しました。なぜこれがあるのかわかりませんが、この問題を理解しようとしている人には役立つことを願っています。
'alembic revision --autogenerate'を実行したときにスキーマがどのように変更されましたか? – drewman
私はいくつかの列を持つ3つのテーブルを追加しました。 – element119
'env.py'でモデルをインポートしてメタデータに登録する必要があります。 – iElectric