2012-04-05 3 views
19

Я знаком с генераторами Python, однако я просто натолкнулся на термин «генеративный метод», с которым я не знаком и не могу найти удовлетворительное определение.Что такое генеративный метод?

Выражаясь в контексте, я нашел этот термин в описательной документации SQLAlchemy в:

Полный контроль поведения «автоматической фиксации» доступен при помощи генеративные Connection.execution_options() метод, предусмотренный на подключение, двигателя, Исполняемый файл, используя флаг «autocommit», который включает или выключает автозапуск для выбранной области.

Что такое генеративный метод? Попытка итерации объекта, возвращаемого Connection.execution_options(), не работает, поэтому я полагаю, что это нечто иное, чем стандартный генератор.

+0

Некоторые прибегая к помощи предполагает, что это может говорить о генерации кода, но это кажется маловероятным ... http://www.program-transformation.org/Transform/GenerativeProgrammingWiki – jimw

+0

Это не означает, что генератор питона, это точно , Этот метод предназначен для изменения состояния соединения, поэтому нет смысла создавать последовательность. – alexis

ответ

30

Это не кажется, общая концепция базы данных, но SQLAlchemy использует термин порождающая в смысле «сгенерированного вашей программой итеративно во время выполнения». (Таким образом, нет связи с генераторами питона). Пример из the tutorial:

Query объекта полностью генеративные, означает, что большинство вызовов методов возвращают новый объект Query, на которой могут быть добавлены дополнительные критерии. Например, для запроса пользователей под названием «изд» с полным названием «Ed Джонс», вы можете вызвать filter() дважды, который присоединяется к критериям, используя AND:

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

Этот синтаксис вызова чаще известный как «цепочка методов», и дизайн, который позволяет использовать его как "fluent interface".

Таким образом, в случае Connection.execution_options() «генеративный» означает, что он возвращает модифицированный объект соединения, чтобы вы могли связать вызовы, как указано выше.

+1

Он также «генерирует» SQL-запросы по частям. – Keith

+0

Да, и всевозможные другие объекты. Операторы SQL - это то, что «Query» инкапсулирует. – alexis

+1

хороший звонок Я мог бы добавить этот термин в документы – zzzeek

3

Вам действительно нужно было бы убедиться в том, что он действительно нуждается в конкретизации конкретной документации или исходного кода этого проекта, но я бы предположил, что он возвращает модифицированную версию некоторого объекта, адаптированную к требованиям/поведению, определенным аргументами.

В documentation состоянии:

Метод возвращает копию этого Connection, который ссылается на один и то же лежащих в основе соединения DBAPI, но и определяет заданные параметры выполнения , которые вступят в силу для вызова execute().

4

Рассматривая исходный код Connection.execution_options (lib/sqlalchemy/engine/base.py), все, что делает этот метод, это добавить параметры соединения.

Идея состоит в том, что эти варианты влияют на будущее поведение, например. запросы.

В качестве примера:

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

Здесь поведение было изменено в середине соединения для всего этого запроса. В некотором роде он «генерирует» или клонирует себя как объект, который имеет несколько другое поведение.

Здесь вы также можете установить autocommit в True. Пример

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

Это то, что имеется в виду в этом разделе документации. «Generative method» относится к методу, который возвращает измененную копию того же экземпляра, с которой вы можете продолжить работу. Это применимо к классам Connection, Engine, Executable.

+0

Не слишком уверен, что изменение является «только для этого запроса». Некоторые из параметров влияют на базовый объект подключения, и поэтому они сохраняются. – alexis

+0

@alexis в примере, который я даю («Здесь»), это просто для этого запроса. Соединение никогда не изменяется с помощью генераторного метода, но возвращается измененная копия. Если вы не хотите привести пример, в котором действительно затронут базовый объект подключения. – j13r

+0

В соответствии с http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.base.Connection.execution_options изменения в 'isol_level' сохраняются до тех пор, пока базовое соединение не будет закрыто. – alexis

0

Как примечания @zzzeek выше, это теперь задокументировано в SQLAlchemy glossary.

generative означает:

Термин, который использует SQLAlchemy для обозначения того, что обычно известно как метод построения цепочки; см. этот термин для деталей.

И method chaining является:

Объектно-ориентированный метод, посредством которого состояние объекта строится путем вызова методов объекта. Объект имеет любое количество методов, каждый из которых возвращает новый объект (или, в некоторых случаях, тот же объект), с добавлением дополнительного состояния к объекту.

Смежные вопросы