2012-09-10 12 views
24

Soy un principiante en SQLAlchemy y encontró consulta se puede hacer en 2 Método:¿Cuál es la diferencia entre Model.query y session.query (Model) en SQLAlchemy?

Enfoque 1:

DBSession = scoped_session(sessionmaker()) 
class _Base(object): 
    query = DBSession.query_property() 

Base = declarative_base(cls=_Base) 

class SomeModel(Base): 
    key = Column(Unicode, primary_key=True) 
    value = Column(Unicode) 

# When querying 
result = SomeModel.query.filter(...) 

Enfoque 2

DBSession = scoped_session(sessionmaker()) 
Base = declarative_base() 

class SomeModel(Base): 
    key = Column(Unicode, primary_key=True) 
    value = Column(Unicode) 

# When querying 
session = DBSession() 
result = session.query(SomeModel).filter(...) 

¿Hay alguna diferencia entre ellos?

Respuesta

1

veo estas desventajas a query_propety:

  • No se puede utilizar en una sesión diferente a la que se ha configurado (aunque siempre se puede utilizar session.query a continuación).
  • Necesita un objeto de sesión disponible antes de definir su esquema.

Esto podría morder cuando quiere escribir pruebas, por ejemplo.

Además, session.query se adapta mejor a cómo funciona SQLAlchemy; query_property parece que se acaba de agregar en la parte superior para mayor comodidad (o similitud con otros sistemas?). Le recomiendo que se adhiera al session.query.

8

En el código anterior, no hay diferencia. Esto es porque, en la línea 3 del primer ejemplo:

  • la propiedad query está obligado explícitamente a DBSession
  • no hay costumbre Query objeto pasa a query_property

como puntos de petr-Viktorin @ en el answer here, debe haber una sesión disponible antes de definir su modelo en el primer ejemplo, lo que podría ser problemático según la estructura de su aplicación.

Sin embargo, si necesita una consulta personalizada que agregue parámetros de consulta adicionales automáticamente a todas las consultas, solo el primer ejemplo lo permitirá. Se puede pasar una clase de consulta personalizada que hereda de sqlalchemy.orm.query.Query como argumento al query_property. This question muestra un ejemplo de ese patrón.

Incluso si un objeto modelo tiene definida una propiedad de consulta personalizada, esa propiedad no se utiliza al consultar con session.query, como en la última línea del segundo ejemplo. Esto significa algo así como el primer ejemplo, la única opción si necesita una clase de consulta personalizada.

1

Una respuesta (here) a una pregunta diferente de SQLAlchemy podría ayudar. Esa respuesta se inicia con:

Usted puede utilizar Model.query, debido a que el Model (o por lo general su clase base, especialmente en los casos en que se utiliza la extensión declarativa) se le asigna Sesssion.query_property. En este caso, el Model.query es equivalente a Session.query(Model).

Cuestiones relacionadas