2016-04-27 15 views
0

私のフラスコアプリケーションは1つのデータベース(db1)を持ちますが、新しいデータベース(db2)をバインドするようになりました。alembic autogenerate Flask-SQLAlchemyバインドのメタデータを取得

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://[email protected]:3306/db1' 

SQLALCHEMY_BINDS = { 
    'test': 'mysql+pymysql://[email protected]:3306/db2' 
} 


db = SQLAlchemy() 

class table1(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
....... 
class table10(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 

class table11(db.Model): 
    __bind_key__ = 'db2' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
...... 
class table20(db.Model): 
    __bind_key__ = 'db2' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 

私は、自動検出にアレンビック自動生成機能を使用したいと別にデシベル1およびDB2の移行を生成するが、db.metadataは、すべてのテーブルのメタデータを取得しますが、どのようにだけバインドDBのメタデータを取得するには?


ありがとう@davidism help!私はinclude_symbolを使ってそれを作ることができます。

def include_symbol(tablename, schema): 
    return tablename in ('table1', 'table2'.......'table10') # for db1 
     # return tablename not in ('table1', 'table2'.......'table10') # for db2 

with connectable.connect() as connection: 
    context.configure(
     connection=connection, 
     target_metadata=target_metadata, 
     include_symbol=include_symbol 
    ) 

答えて

1

この機能はまだ存在しないため、できません。現在、すべてのバインドのすべてのモデルに対して1つのメタデータインスタンスが存在します。すべてのモデルがユニークな名前を持っている限り、これは大きな問題ではありません。

this patchを適用して新しいリリースを作成すると、各バインドには独自のメタデータが設定されます。これで、db.get_metadata(bind='db2')でアクセスできます。

+0

ありがとうございました! – pangpang

+0

私たちはマイグレーションに 'alembic'を使用しているので、各dbに対してalembic autogenerate関数を使いたいのですが、' db.metadata'にはすべてのテーブルオブジェクトが含まれています。 – pangpang

+1

バインドキーを持つテーブルに属するオブジェクトを除外する関数を使用できます。http://alembic.readthedocs.org/en/latest/api/runtime.html#alembic.runtime.environment.EnvironmentContext.configure.params .include_object – davidism

関連する問題