2012-06-04 16 views
11

Więc używania i uczenia się z SQLAlchemy.instancji modelu i metody: sesja świadomy (sqlalchemy)

Mam instancję, trzeba uzyskać wartość. Jeśli ta wartość istnieje, zwróć ją. Jeśli nie obliczyć i zwrócić.

Niezmiennie ktoś powie „robisz to źle”, a wejście na poprawę jest doceniana w ogóle. jednak szukam w jaki sposób mogę to zrobić bez konieczności jawnie zarządzać sesję, ponieważ to, co ja pracuję nad zaczyna się rozwijać i stale zarządzanie sesji dla gdy chcę zaktualizować instancją jest problematyczne. To sprawia, że ​​myślę, że Jestem w rzeczywistości robi to źle.

Więc jak to naprawić metodą poniżej nie mają zarządzać sesję wyraźnie?

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 

Może to pytanie powinna być zatytułowana „co sesja przypadki świadomość, więc nie jestem zawsze wyraźnie zarządzania nim”, a jeśli jest to głupie pytanie, przynajmniej mi pokazać, dlaczego wraz z przykładami i wskazać mi gdzie inni zapytał lepiej.

Edycja: podobno importowanie sesji, z której korzystam, działa, i jest dostępne, więc może nie jest to problem lub przyszłość, kiedy jestem bardziej zaawansowany w sqlalchemy.

Odpowiedz

21

Twoje pytanie jest tak powszechne, że odpowiedź na to jest w Session Frequently Asked Questions dokumentacji SA:

  • Jak mogę uzyskać sesji dla określonego obiektu? pomocą object_session() classmethod dostępne w sesji:
    session = Session.object_session(someobject)

jednak zakłada, że ​​obiekt jest trwałe i zarówno nowych (ale dodaje się do sesji już) lub związane z sesją. Twój przykładowy kod zawiera logikę, aby dodać obiekt do sesji, więc moje założenie może nie być prawdziwe w tym przypadku.

+0

Uważam, że dobrze Przeczytałem to, naprawdę szukałem lepszego sposobu na integrację sesji z moimi modelami i to pomaga. – blueblank

6

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

  • Można użyć SA Runtime Inspection API:

    from sqlalchemy import inspect 
    # ... 
    # within instance method 
    session = inspect(self).session 
    
  • lub object_session() metoda:

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

Czy ktoś może wyjaśnić różnicę między tymi dwoma? – smilledge

+0

Łącze na początku odpowiedzi trafia bezpośrednio do dokumentacji SqlAlchemy. – boatcoder

Powiązane problemy