2017-01-09 8 views
3

Ich baue eine Python-App um eine bestehende (MySQL) Datenbank und automap bin mit Tabellen und Beziehungen zu folgern:SQLAlchemy automap: Best Practices für die Leistung

base = automap_base() 

    self.engine = create_engine(
     'mysql://%s:%[email protected]%s/%s?charset=utf8mb4' % (
      config.DB_USER, config.DB_PASSWD, config.DB_HOST, config.DB_NAME 
     ), echo=False 
    ) 

    # reflect the tables 
    base.prepare(self.engine, reflect=True) 

    self.TableName = base.classes.table_name 

das Verwenden ich Dinge tun können wie session.query(TableName) etc ... Allerdings mache ich mir Sorgen um die Leistung, denn jedes Mal, wenn die App läuft, wird sie den ganzen Rückschluss wiederholen.

  • Ist dies ein legitimes Anliegen?
  • Wenn ja, gibt es eine Möglichkeit, die Ausgabe von Automap zu "cachen"?

Antwort

2

Die Antwort auf Ihre erste Frage ist weitgehend subjektiv. Sie fügen Datenbankabfragen hinzu, um die Reflektions-Metadaten zur Ladezeit der Anwendung abzurufen. Ob dieser Aufwand signifikant ist, hängt von Ihren Projektanforderungen ab.

Als Referenz habe ich ein internes Tool bei der Arbeit, die ein Reflexionsmuster verwendet, weil die Ladezeit für unser Team akzeptabel ist. Dies könnte nicht der Fall sein, wenn es sich um ein nach außen gerichtetes Produkt handelt. Meine Vermutung ist, dass für die meisten Anwendungen der Reflektionsaufwand nicht die gesamte Anwendungsladezeit dominiert.

Wenn Sie entscheiden, dass es für Ihre Zwecke wichtig ist, hat diese question eine interessante Antwort, wo der Benutzer die Datenbank-Metadaten einläßt, um sie lokal zwischenzuspeichern.

2

Ich denke, dass das "Reflektieren" der Struktur Ihrer Datenbank nicht der richtige Weg ist. Wenn Ihre App nicht versucht, Dinge aus der Struktur "abzuleiten", wie das bei der statischen Codeanalyse für Quelldateien der Fall ist, dann ist das nicht nötig. Der andere Grund dafür, es zur Laufzeit zu reflektieren, wäre die reduzierte Zeit, um mit SQLAlchemy die Datenbank zu "benutzen". Allerdings:

Eine andere Möglichkeit wäre so etwas wie SQLACodegen zu verwenden (https://pypi.python.org/pypi/sqlacodegen):

Es wird „reflektieren“ Ihre Datenbank einmal und eine 99,5% korrekt Satz von deklarativen SQLAlchemy Modelle erstellen für Sie zu arbeiten. Dies erfordert jedoch, dass Sie das Modell anschließend synchron mit der Struktur der Datenbank halten. Ich nehme an, dass dies keine große Sorge ist, da die Tabellen, mit denen Sie bereits arbeiten, stabil genug sind, so dass die Laufzeit-Reflektion ihrer Struktur sich nicht sehr auf Ihr Programm auswirkt.

Die Generierung der deklarativen Modelle ist im Wesentlichen ein "Cache" der Reflexion. Es ist nur, dass SQLACodegen es in einem sehr lesbaren Satz von Klassen + Feldern anstelle von Daten im Speicher gespeichert hat. Selbst mit einer sich ändernden Struktur und meinen eigenen "Änderungen" an den generierten deklarativen Modellen verwende ich SQLACodegen später immer noch in einem Projekt, wenn ich Datenbankänderungen mache. Das bedeutet, dass meine Modelle im Allgemeinen konsistent zueinander sind und dass ich keine Dinge wie Tippfehler und fehlende Daten aufgrund von Kopieren und Einfügen habe.