2012-04-05 26 views
19

Estoy familiarizado con los generadores Python, sin embargo, acabo de encontrar el término "método generativo" con el que no estoy familiarizado y no puedo encontrar una definición satisfactoria.¿Qué es un método generativo?

Para ponerlo en contexto, me encontré con el término en la documentación de la narrativa de SQLAlchemy:

Control absoluto de la conducta “confirmación automática” está disponible utilizando los Connection.execution_options generativos() método proporciona en Conexión, motor, Ejecutable, usando el indicador "autocommit" que activará o desactivará el autocommit para el alcance seleccionado.

¿Qué es un método generativo? Intentar iterar el objeto devuelto por Connection.execution_options() no funciona, así que supongo que es algo más que un generador estándar.

+0

algunas google sugiere que podría estar hablando de la generación de código, pero que parece poco probable ... http://www.program-transformation.org/Transform/GenerativeProgrammingWiki – jimw

+0

Esto no significa que un generador de pitón, eso es seguro . Este método es para modificar el estado de la conexión, por lo que no tiene sentido que produzca una secuencia. – alexis

Respuesta

30

No parece ser un concepto base de datos común, pero SQLAlchemy utiliza el término generativa en el sentido de "generado por el programa de forma iterativa en tiempo de ejecución". (Entonces, no hay conexión con generadores de pitón). Un ejemplo de the tutorial:

El objeto Query es totalmente generativo, lo que significa que la mayoría método llama devolver una nueva Query objeto sobre el cual se pueden añadir otros criterios. Por ejemplo, para consultar a los usuarios con nombre “ed” con un nombre completo de “Ed Jones”, puede llamar filter() dos veces, que se une a los criterios de uso de Y:

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

Esta sintaxis de llamada es más comúnmente conocido como "método de encadenamiento", y el diseño que lo permite como "fluent interface".

Por lo tanto, en el caso de Connection.execution_options(), "generativo" significa que devuelve el objeto de conexión modificado, de modo que puede encadenar las llamadas como se indicó anteriormente.

+1

También "genera" declaraciones SQL por partes. – Keith

+0

Sí, y todo tipo de otros objetos. Las declaraciones SQL son lo que encapsula 'Query', de hecho. – alexis

+1

buena llamada Me gustaría agregar ese término a los documentos – zzzeek

3

Debería consultar la documentación específica o el código fuente de ese proyecto para asegurarse realmente, pero supongo que devuelve una versión modificada de algún objeto adaptado a los requisitos/comportamiento definidos por los argumentos.

Los documentation estados:

El método devuelve una copia de este Connection que hace referencia a la misma conexión DBAPI subyacente , pero también define las opciones dadas ejecución que entrarán en vigor para una llamada a execute().

4

Al mirar el código fuente de Connection.execution_options (lib/sqlalchemy/engine/base.py), todo lo que hace es agregar opciones a la conexión.

La idea es que esas opciones influyan en el comportamiento futuro de, p. consultas.

A modo de ejemplo:

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

En este caso, el comportamiento fue cambiado en el medio de la conexión por sólo esta consulta. En cierto modo, se "genera" o se clona a sí mismo como un objeto que tiene un comportamiento ligeramente diferente.

Aquí también puede establecer el compromiso automático en True. Ejemplo

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

Esto es lo que se entiende con esa sección de la documentación. "método generativo" se refiere a un método que devuelve una copia modificada de la misma instancia con la que puede continuar trabajando. Esto es aplicable a las clases Conexión, Motor, Ejecutable.

+0

No esté tan seguro de que el cambio es "solo por esta consulta". Algunas de las opciones afectan al objeto de conexión subyacente, por lo que persisten. – alexis

+0

@alexis en el ejemplo que doy ("Aquí") es solo para esta consulta. La conexión nunca se modifica por el método generativo, pero se devuelve una copia modificada. A menos que le importe dar un ejemplo donde el objeto de conexión subyacente se ve realmente afectado. – j13r

+0

Según http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.base.Connection.execution_options, los cambios en 'isolation_level' persisten hasta que se cierra la conexión subyacente. – alexis

0

Como @zzzeek comenta arriba, esto ahora está documentado en SQLAlchemy glossary.

generative significa:

Un término que SQLAlchemy utiliza para referirse lo que normalmente se conoce como encadenamiento método; ver ese término para más detalles.

Y method chaining es:

Una técnica orientada a objetos mediante el cual el estado de un objeto se construye llamando a métodos en el objeto. El objeto presenta cualquier número de métodos, cada uno de los cuales devuelve un objeto nuevo (o en algunos casos el mismo objeto) con un estado adicional agregado al objeto.

Cuestiones relacionadas