2012-06-04 701 views
11

Por lo tanto, utilizar y aprender con sqlalchemy.modelos y métodos de instancia: session aware (sqlalchemy)

Tengo una instancia, necesito obtener un valor. Si ese valor existe, devuélvalo. Si no se calcula y se lo devuelve.

Invariablemente, alguien dirá "lo está haciendo mal" y la apreciación de la mejora se agradece en general. Sin embargo, estoy buscando cómo puedo hacer esto sin tener que administrar explícitamente la sesión, porque lo que estoy trabajando en está comenzando a crecer, y administrar constantemente la sesión para cuando quiero actualizar una instancia es problemático. Me hace pensar que yo soy, de hecho, lo estoy haciendo mal.

Entonces, ¿cómo puedo solucionar el siguiente método para no administrar la sesión explícitamente?

def method(self, session): 
     if self.i_needed_this is None: 
      self.i_needed_this = calculate(calcutron) 
      session.add(self) 
      session.commit() 
      return self.i_needed_this       
     else: 
      return self.i_needed_this 

Tal vez esta pregunta debe ser titulado 'sesión de toma de instancias conscientes así que no estoy gestión siempre explícitamente', y si es una pregunta tonta, al menos Demuéstrame que con ejemplos y me punto a donde otros tienen preguntó mejor.

Editar: al parecer, la importación de la sesión que estoy usando funciona, y está disponible, por lo que tal vez no sea un problema o una futura para cuando tenga más experiencia con sqlalchemy.

Respuesta

21

Su pregunta es tan común, que la respuesta a ella se encuentra en la documentación de Session Frequently Asked Questions SA:

  • ¿Cómo puedo obtener la Sesión para un determinado objeto? Utilice la classmethod object_session() disponibles en la sesión:
    session = Session.object_session(someobject)

Sin embargo, se supone que el objeto es persistente y es nuevas (pero añadió a una sesión ya) o unido a una sesión. Su código de muestra contiene lógica para agregar el objeto a la sesión, por lo que mi suposición podría no ser cierta en este caso.

+0

encontré que así una Lo leí, realmente solo buscaba una forma mejor de integrar una sesión a mis modelos y esto ayuda. – blueblank

6

Ver How can I get the Session for a certain object?:

  • Puede usar SA Duración Inspección API:

    from sqlalchemy import inspect 
    # ... 
    # within instance method 
    session = inspect(self).session 
    
  • o object_session() método:

    from sqlalchemy.orm.session import Session 
    # ... 
    # within instance method 
    session = Session.object_session(self) 
    
+3

¿Alguien puede explicar la diferencia entre estos dos? – smilledge

+0

El enlace al inicio de la respuesta va directamente a la documentación de SqlAlchemy. – boatcoder

Cuestiones relacionadas