2012-04-05 7 views
19

Ich bin vertraut mit Python-Generatoren, aber ich bin gerade auf den Begriff "generative Methode" gestoßen, den ich nicht kenne und der keine befriedigende Definition findet.Was ist eine generative Methode?

Um es in Zusammenhang zu bringen, fand ich den Begriff in SQLAlchemy Erzählung Dokumentation:

Volle Kontrolle des „autocommit“ Verhaltens ist die generativen Connection.execution_options zur Verfügung() -Methode auf Anschluss vorgesehen, Motor, Ausführbare Datei, die das Autocommit-Flag verwendet, das den Autocommit für den ausgewählten Bereich aktiviert oder deaktiviert.

Was ist eine generative Methode? Der Versuch, das von Connection.execution_options() zurückgegebene Objekt zu iterieren, funktioniert nicht, also denke ich, dass es etwas anderes als ein Standardgenerator ist.

+0

Einige googeln schlägt vor, könnte es über Code Generation sprechen, aber das scheint unwahrscheinlich ... http://www.program-transformation.org/Transform/GenerativeProgrammingWiki – jimw

+0

Es ist nicht ein Python-Generator bedeutet, das ist sicher . Diese Methode dient zum Ändern des Verbindungsstatus. Daher ist es nicht sinnvoll, eine Sequenz zu erstellen. – alexis

Antwort

30

Es scheint nicht, ein gemeinsames Datenbank-Konzept zu sein, aber SQLAlchemy verwendet den Begriff generative im Sinne „von Ihrem Programm iterativ zur Laufzeit generierte“. (Also, keine Verbindung zu Python-Generatoren). Ein Beispiel aus the tutorial:

Das Query Objekt ist vollständig generative, was bedeutet, dass die meisten Verfahren Rückrufe ein neues Query Objekt, auf dem weiteren Kriterien hinzugefügt werden. Zum Beispiel für Benutzer namens „ed“ mit einem vollen Namen „Ed Jones“ abfragen, Sie filter() zweimal anrufen können, welche Kriterien schließt sich mit AND:

>>> for user in session.query(User).\ 
... filter(User.name=='ed').\ 
... filter(User.fullname=='Ed Jones'): 
...  print user 

Dieser Aufruf Syntax häufiger ist bekannt als "method chaining", und das Design, das es als "fluent interface" ermöglicht.

Im Fall von Connection.execution_options() bedeutet "generativ", dass es das geänderte Verbindungsobjekt zurückgibt, so dass Sie die Aufrufe wie oben beschrieben verketten können.

+1

Es "generiert" auch SQL-Anweisungen Stückwerk. – Keith

+0

Ja, und alle möglichen anderen Objekte. SQL-Anweisungen sind das, was 'Query' kapselt. – alexis

+1

guten Ruf Ich möchte diesen Begriff der Docs hinzufügen – zzzeek

3

Sie müssten die spezifische Dokumentation oder den Quellcode dieses Projekts konsultieren, um wirklich sicher zu gehen, aber ich würde vermuten, dass es eine modifizierte Version eines Objekts zurückgibt, das an die Anforderungen/Verhaltensweisen der Argumente angepasst ist.

Die documentation Zustände:

Verfahren eine Kopie dieser Connection gibt, die die gleiche zugrunde liegenden DBAPI Verbindung verweist, sondern definiert auch die Ausführung Optionen gegeben, die Wirkung für einen Anruf zu execute() nehmen.

4

Wenn Sie den Quellcode von Connection.execution_options (lib/sqlalchemy/engine/base.py) betrachten, fügt diese Methode nur Optionen zur Verbindung hinzu.

Die Idee ist, dass diese Optionen das zukünftige Verhalten von z.B. Abfragen.

Als Beispiel:

 result = connection.execution_options(stream_results=True).\ 
          execute(stmt) 

Hier wurde das Verhalten in der Mitte der Verbindung nur für diese Abfrage geändert. In gewisser Weise "generiert" oder klont es sich selbst als ein Objekt, das ein etwas anderes Verhalten hat.

Hier können Sie auch Autocommit auf True setzen. Beispiel

# obtain a connection 
connection = ... 
# do some stuff 
# for the next section we want autocommit on 
autocommitting_connection = connection.execution_options(autocommit=True) 
autocommitting_connection.execute(some_insert) 
result = autocommitting_connection.execute(some_query) 
# done with this section. Continue using connection (no autocommit) 

Dies ist mit diesem Abschnitt der Dokumentation gemeint. "Generative Methode" bezieht sich auf eine Methode, die eine modifizierte Kopie derselben Instanz zurückgibt, mit der Sie weiterarbeiten können. Dies gilt für die Klassen Connection, Engine, Executable.

+0

Seien Sie nicht so sicher, dass die Änderung "nur für diese Abfrage" ist. Einige der Optionen wirken sich auf das zugrunde liegende Verbindungsobjekt aus und bleiben daher erhalten. – alexis

+0

@alexis im Beispiel gebe ich ("hier") es ist nur für diese Abfrage. Die Verbindung wird nie durch die generative Methode modifiziert, sondern eine modifizierte Kopie zurückgegeben. Es sei denn, Sie möchten ein Beispiel geben, in dem das zugrundeliegende Verbindungsobjekt wirklich betroffen ist. – j13r

+0

Laut http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.base.Connection.execution_options bleiben Änderungen in "isolation_level" bestehen, bis die zugrunde liegende Verbindung geschlossen wird. – alexis

0

Als @zzzeek Kommentare oben ist dies jetzt in der SQLAlchemy glossary dokumentiert.

generative bedeutet:

Ein Begriff, der SQLAlchemy beziehen verwendet, was normalerweise als Verfahren Verkettungs bekannt ist; Siehe diesen Begriff für Details.

Und method chaining ist:

Eine objektorientierte Technik, bei der der Zustand eines Objekts durch Aufrufen von Methoden für das Objekt aufgebaut ist. Das Objekt enthält eine beliebige Anzahl von Methoden, von denen jede ein neues Objekt (oder in einigen Fällen das gleiche Objekt) zurückgibt, wobei dem Objekt ein zusätzlicher Status hinzugefügt wird.

Verwandte Themen