2016-04-25 10 views
1

Ich habe eine Kolben-App, die Flask-SQLAlchemy verwendet, um auf MySQL zuzugreifen. Jetzt möchte ich das Datenmodell in der gleichen App umgestalten, also habe ich eine neue Versionsmodelldatei erstellt, aber einige Tabellen sollten den gleichen Namen wie die alte Tabelle haben.ist es möglich zu vermeiden Tabellenname Konflikt bei der Verwendung von zwei Datenmodell in Flask-sqlalchemy

oldmodel.py

class TableA(db.Model): 
    __tablename__ = 'TableA' 
    ... 

newmodel.py

class TableA(db.Model): 
    __tablename__ = 'TableA' 
    ... 

ich eine Funktion schreiben, ist die Idee, Daten von alten MetaDaten abzufragen dann durch neue Metadaten neue Datenbank schreiben nach einigen Spalten Daten Manipulation, aber es wird offensichtlich gleichen Tabellennamen Konflikt in Flask-SQLAlchemy. die Fehlermeldung

sqlalchemy.exc.InvalidRequestError: Table 'TableA' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object. 

Ich will nicht verwenden, um auf alte Datenbank Flask-Migration, aber neue Datenbank zu erstellen. Ich habe auch versucht, __bind_key__, scheint es in einer neuen Tabelle zu arbeiten, aber nicht in bestehenden Tabelle, die bereits Daten hatte.

ist es möglich, dies zu vermeiden, um zwei Versionen von DataModel in derselben App zu verwenden? oder andere Vorgehensweise?

Antwort

0

schließlich fand ich einen Weg, das zu tun, änderte sich das Modell der reinen sqlalchemy Stil, wie

oldmodel.py

from sqlalchemy.ext.declarative import declarative_base 
BaseOld = declarative_base() 
class TableA(BaseOld): 
    __tablename__ = 'TableA' 

newmodel.py

from sqlalchemy.ext.declarative import declarative_base 
BaseNew = declarative_base() 
class TableA(BaseNew): 
    __tablename__ = 'TableA' 

dann zwei erstellen Engines zu verschiedenen db mit entsprechender Sitzung. Jetzt ist es sehr einfach, von alten db abzufragen und in neue db zu schreiben, wie Sie wollen. Ein Trick beim Import derselben Namensklasse verwendet 'from XXX import XXX as XXX', um einen Klassennamenkonflikt zu vermeiden.

eine andere Möglichkeit, wenn noch db.Model von flask-sqlalchemy zu verwenden ist bind_key Funktion. Es kann die Model-Klasse in eine andere Datenbank aufteilen, aber eine große Einschränkung ist, dass der Model-Klassenname nicht in Konflikt stehen sollte.

Verwandte Themen