Подтвердить что ты не робот

Что такое генеративный метод?

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

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

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

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

4b9b3361

Ответ 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 для обозначения того, что обычно называют цепочкой методов; см. этот термин для деталей.

И цепочка методов:

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