2012-08-02 8 views
5

Wir verwenden die Autoload-Funktion von sqlalchemy, um Spaltenzuordnungen zu machen, um eine Hardcodierung in unserem Code zu verhindern.sqlalchemy autoloaded orm Persistenz

class users(Base): 
    __tablename__ = 'users' 
    __table_args__ = { 
     'autoload': True, 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

Gibt es eine Möglichkeit zur Serialisierung oder Cache automatisch geladen Metadaten/orms so müssen wir nicht jedes Mal durch den Autoload-Prozess gehen wir brauchen, um unsere ORM-Klassen aus anderen Skripten/Funktionen verweisen?

Ich habe Becherglas Caching und Gurke betrachtet, aber habe keine klare Antwort gefunden, wenn es möglich ist oder wie es geht.

Idealerweise laufen wir autload Mapping-Script nur dann, wenn wir Änderungen an unserer Datenbankstruktur begangen haben, aber eine nicht-autoload/persistent/Cache-Version unserer Datenbank Mapping von allen anderen Skripten/Funktionen verweisen,

Irgendwelche Ideen?

+0

Warum nicht umgekehrt: Definieren Sie das vollständige Modell in SA. Als Nebeneffekt fungiert dies als Quellcodeverwaltung für das Datenbankschema. * Natürlich funktioniert das nur, wenn Ihre SA-Anwendung die primäre Kontrolle über die Datenbank (en) hat, mit denen Sie arbeiten * – van

+0

Datenbankentwicklung wird in meinem Fall separat gehandhabt, bedeutet die Anwendung wird nicht wie volle Kontrolle. Ich habe jedoch einen Weg gefunden, Metadaten zu pickeln, so dass ich nur einmal über die Datenbankverbindung reflektieren muss, um die Beize zu erzeugen, die Zeit, in der ich die eingelegten Metadaten verwende, um einen Bruchteil der Zeit über die db-Verbindung abzubilden (siehe unten). – user1572502

Antwort

5

Was ich jetzt mache, besteht darin, die Metadaten nach dem Ausführen der Reflektion durch eine Datenbankverbindung (MySQL) zu pickeln. Sobald ein Pickle verfügbar ist, verwenden Sie diese eingelegten Metadaten, um das Schema mit den an eine SQLite-Engine gebundenen Metadaten zu reflektieren.

Alle Kommentare, wenn das in Ordnung ist (es funktioniert) oder gibt es etwas, das ich verbessern kann?

+2

Sie könnten dies wahrscheinlich vereinfachen, nur um das eine MetaData-Objekt zu verwenden, und auch einfach ein "if os.path.exists (cachefile)" zu bestimmen, ob Sie nicht entpacken oder nicht. "Tabelle ('Benutzer', Metadaten, Autoload = True)" und diese muss nur einmal angegeben werden, da Sie, wie Sie bereits gesehen haben, die Reflektion überspringt, wenn die Tabelle bereits in den MetaData enthalten ist. – zzzeek

+1

Ich denke, es gibt keine Notwendigkeit, eine Datei zu schließen, wenn sie innerhalb einer 'with'-Anweisung verwendet wird, aber das ist nicht verwandt. Ihr Ansatz scheint interessant, funktioniert es wie erwartet? – jadkik94

Verwandte Themen