15

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.pydb = SQLAlchemy(app)。おそらく悪い考えですが、デバッグ目的で何が起こるかを見たかったのです。

Alembic が自動生成し、upgrade() および downgrade() メソッドを埋めましたが、逆になっていました! 適切な列とメタデータをすべて使用して作成しupgrade()ながら、3 つのテーブルすべてを削除しました。downgrade()これがなぜなのかはわかりませんが、この問題を理解しようとしている人々に役立つことを願っています.

4

1 に答える 1

28

Flask とブループリントで Alembic を使用する方法を次に示します。

https://github.com/davidism/basic_flask

アプリケーション ファクトリ パターンを使用し、そのdb.init_app中で呼び出します。サブクラス化するdb = SQLAlchemy()すべてのモデルをインポートした後、それらを認識します。これは工場で行われるのではなく、モジュールの初期化中にインラインで行われることに注意してください。db.Modeldb.metadatacreate_app

実行時alembicはプロジェクトフォルダが入っていないsys.pathので設定します。次に、工場からアプリを作成し、sqlalchemy.urlその構成から設定します。また、インポートdbして設定しtarget_metadata = db.metadataます。

このセットアップは、プロジェクトの構造に関係なく、常に機能します。私は非常に基本的なユーザー モデルのセットと非常に馬鹿げたビューを、青写真を含むサブパッケージに含めました。関連するモデルを にロードしload_models、設計図を定義した後にビューをインポートし、設計図を にインポートしてinit_viewsください。

于 2013-06-25T16:30:14.517 に答える