2012-04-05 27 views
19

Jestem zaznajomiony z generatorami Pythona, jednak właśnie natknąłem się na termin "metoda generatywna", której nie znam i nie mogę znaleźć zadowalającej definicji.Co to jest metoda generatywna?

Aby umieścić go w kontekście uważam, że termin w dokumentacji opisowej sqlalchemy za:

Pełna kontrola „automatycznego zatwierdzania” zachowania jest dostępny za pomocą generatywnej Connection.execution_options() metody przewidzianej dla połączeń, silnik, Plik wykonywalny, za pomocą flagi "autocommit", która włącza lub wyłącza automatyczne zatwierdzanie dla wybranego zakresu.

Co to jest metoda generatywna? Próba iteracji obiektu zwróconego przez Connection.execution_options() nie działa, więc domyślam się, że jest to coś innego niż standardowy generator.

+0

Niektóre googling sugeruje, że mógł mówić o generowanie kodu, ale to wydaje się mało prawdopodobne ... http://www.program-transformation.org/Transform/GenerativeProgrammingWiki – jimw

+0

To nie znaczy, generator Pythona, to na pewno . Ta metoda służy do modyfikowania stanu połączenia, więc nie ma sensu tworzenie sekwencji. – alexis

Odpowiedz

30

To nie wydaje się być wspólne pojęcie bazy danych, ale SQLAlchemy używa terminu generatywna w sensie „generowanego przez program iteracyjnie przy starcie”. (Tak więc, nie ma połączenia z generatorami Pythona). Przykład z the tutorial:

Przedmiotem Query pełni generatywnego oznacza, że ​​połączenia najbardziej Sposób powrotu nowy Query przedmiotu, na którym kolejne kryteria, mogą być dodawane. Na przykład, aby zapytać o użytkowników nazwanych „ed” z pełną nazwą „Ed Jones”, można nazwać filter() dwukrotnie, która łączy kryteria korzystania I:

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

Ta składnia wywołania jest bardziej powszechnie znany jako "metoda łańcuchowa" i projekt, który pozwala na to jako "fluent interface".

Tak więc, w przypadku Connection.execution_options(), "generative" oznacza, że ​​zwraca zmodyfikowany obiekt połączenia, dzięki czemu można łączyć wywołania jak wyżej.

+1

To również "generuje" fragmentaryczne instrukcje SQL. – Keith

+0

Tak, i wiele innych obiektów. Instrukcje SQL są tym, co w rzeczywistości oznacza 'Query'. – alexis

+1

dobry telefon Mogę dodać ten termin do dokumentów – zzzeek

3

Będziesz musiał sprawdzić konkretną dokumentację lub kod źródłowy tego projektu, aby upewnić się, ale zwróci to zmodyfikowaną wersję jakiegoś obiektu dostosowanego do wymagań/zachowania określonych przez argumenty.

W documentation stany:

Metoda zwraca kopię tej Connection który odwołuje się do tego samego Połączenie podstawowe DBAPI, ale także określa podane wykonanie opcje, które będą miały wpływ na wywołanie execute().

4

Patrząc na kod źródłowy Connection.execution_options (lib/sqlalchemy/engine/base.py), jedyną metodą jest dodanie opcji do połączenia.

Chodzi o to, że te opcje mają wpływ na przyszłe zachowanie np. zapytania.

Jako przykład:

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

Tutaj zachowanie zostało zmienione w środku połączenia tylko dla tego zapytania. W pewnym sensie "generuje" lub klonuje się jako obiekt, który ma nieco inne zachowanie.

Tutaj można również ustawić Autocommit na True. Przykład

# 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) 

To właśnie należy rozumieć w tej części dokumentacji. "metoda generatywna" odnosi się do metody, która zwraca zmodyfikowaną kopię tej samej instancji, z którą można dalej pracować. Dotyczy to klas Połączenie, Silnik, Plik wykonywalny.

+0

Nie bądź zbyt pewny, że zmiana jest "tylko dla tego zapytania". Niektóre opcje wpływają na podstawowy obiekt połączenia i dlatego są trwałe. – alexis

+0

@alexis w podanym przykładzie ("tutaj") jest właśnie dla tego zapytania. Połączenie nigdy nie jest modyfikowane przez metodę generatywną, ale zwrócono zmodyfikowaną kopię. Chyba, że ​​chcesz podać przykład, w którym istotny jest podstawowy obiekt połączenia. – j13r

+0

Zgodnie z http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.base.Connection.execution_options, zmiany na 'poziomie izolacji 'trwają do momentu zamknięcia podstawowego połączenia. – alexis

0

Jak powyżej powyższe komentarze @zzzeek, ​​jest to teraz udokumentowane w SQLAlchemy glossary.

generative oznacza

Termin ten odnosi SQLAlchemy wykorzystuje co zwykle znana jako metoda szeregowaniu; patrz to określenie po szczegóły.

I method chaining jest:

technika obiektowego przy czym stan obiektu jest wykonana poprzez wywołanie metody na obiekcie. Obiekt zawiera dowolną liczbę metod, z których każda zwraca nowy obiekt (lub w niektórych przypadkach ten sam obiekt) z dodatkowym stanem dodanym do obiektu.