2016-04-27 11 views
0

Meine Kolben-Anwendung hat eine einzige Datenbank (db1) vor, jetzt binde ich eine neue Datenbank (db2), beide hat 10 Tabellen.Alambic Autogenerate Holen Sie sich die Metadaten für eine Flask-SQLAlchemy Bindung

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) 

Ich möchte alembic autogenerate-Funktion verwenden, um automatische Erfassen und Erzeugen von Migrationen für db 1 und db2 getrennt, aber db.metadata werden alle Tabellen-Metadaten erhalten, aber wie nur Metadaten binden db bekommen?


Dank @davidism Hilfe! Ich kann include_symbol verwenden, um es zu erstellen.

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 
    ) 

Antwort

1

Sie können nicht, weil diese Funktion noch nicht existiert. Gegenwärtig gibt es für alle Modelle eine Metadateninstanz für alle Bindungen. Solange alle Modelle eindeutige Namen haben, ist das kein großes Problem.

Wenn wir this patch anwenden und eine neue Version erstellen, hat jede Bindung ihre eigenen Metadaten. Sie können dann mit db.get_metadata(bind='db2') darauf zugreifen.

+0

Danke für Hilfe! – pangpang

+0

, weil wir 'alembic' zur Migration verwenden, und wir die alembic autogenerate-Funktion für jede db verwenden möchten, aber die' db.metadata' enthält alle Tabellenobjekte. – pangpang

+1

Sie können eine Funktion verwenden, die Objekte ausschließt, die zu einer Tabelle mit einem Bind-Schlüssel gehören: http://alembic.readthedocs.org/en/latest/api/runtime.html#alembic.runtime.environment.EnvironmentContext.configure.params .include_object – davidism