Что такое генеративный метод?
Я знаком с генераторами Python, однако я просто натолкнулся на термин "генеративный метод", с которым я не знаком и не могу найти удовлетворительное определение.
Чтобы выразить это в контексте, я нашел термин в описательной документации SQLAlchemy:
Полный контроль над поведением "autocommit" доступен с помощью генераторного метода Connection.execution_options(), предоставленного в Connection, Engine, Executable, с использованием флага "autocommit", который включает или выключает автозапуск для выбранной области.
Что такое генеративный метод? Попытка итерации объекта, возвращаемого Connection.execution_options()
, не работает, поэтому я считаю это чем-то отличным от стандартного генератора.
Ответы
Ответ 1
Он не является общей концепцией базы данных, но SQLAlchemy использует термин генеративный в смысле "сгенерированный вашей программой итеративно во время выполнения". (Таким образом, нет связи с генераторами питона). Пример из учебника:
Объект Query
полностью генеративный,, что означает, что большинство вызовов метода возвратите новый объект Query
, по которому могут быть добавлены дополнительные критерии. Например, для запроса пользователей с именем "ed" с полным именем "Ed Jones", вы можете дважды вызвать filter()
, который объединяет критерии с использованием AND:
>>> for user in session.query(User).\
... filter(User.name=='ed').\
... filter(User.fullname=='Ed Jones'):
... print user
Этот синтаксис вызова более известен как "цепочка методов" и дизайн, который позволяет использовать его как "свободный интерфейс" .
Итак, в случае Connection.execution_options()
"генеративный" означает, что он возвращает измененный объект соединения, так что вы можете связать вызовы, как указано выше.
Ответ 2
Посмотрев исходный код 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.
Ответ 3
Вам нужно будет проконсультироваться с конкретной документацией или исходным кодом этого проекта, чтобы действительно убедиться, но я бы предположил, что он возвращает модифицированную версию некоторого объекта, адаптированного к требованиям/поведению, определенным аргументами.
В документации указано:
Метод возвращает копию этого Connection
, который ссылается на тот же базовое соединение DBAPI, но также определяет данное выполнение параметры, которые вступят в силу для вызова execute()
.
Ответ 4
Как и комментарии @zzzeek выше, это теперь задокументировано в SQLAlchemy glossary.
generative означает:
Термин, используемый SQLAlchemy для обозначения того, что обычно называют цепочкой методов; см. этот термин для деталей.
И цепочка методов:
Объектно-ориентированная техника, при которой состояние объекта строится путем вызова методов на объекте. Объект имеет любое количество методов, каждый из которых возвращает новый объект (или, в некоторых случаях, тот же объект) с добавленным дополнительным состоянием объекта.