2012-08-24 4 views
5

SQL Alchemy에 문제가 있습니다. 내 응용 프로그램은 계속 작동하는 Python 응용 프로그램으로 작동합니다. 하나 개의 결과 세트가 데이터베이스에서 가져온 것입니다, 두 번째는 단지 인수로 전달됩니다 -sqlalchemy에서 캐싱을 피하는 방법?

def myFunction(self, param1): 
    s = select([statsModel.c.STA_ID, statsModel.c.STA_DATE)])\ 
         .select_from(statsModel) 

    statsResult = self.connection.execute(s).fetchall() 

    return {'result': statsResult, 'calculation': param1} 

나는이 좋은 예라고 생각합니다 :

는이 같은 기능을 가지고있다.

문제는 데이터베이스에서 데이터를 변경할 때이 함수는 아무 것도 변경되지 않은 것처럼 데이터를 반환한다는 것입니다. 입력 매개 변수에서 데이터를 변경할 때 반환 된 매개 변수 "계산"에 적절한 값이 있습니다.

응용 프로그램 서버를 다시 시작하면 상황이 정상적으로 돌아옵니다. MySQL에서 새 데이터를 가져옵니다.

How to disable caching correctly in Sqlalchemy orm session?

How to disable SQLAlchemy caching?

하지만 어떻게 다른 내가 호출 할 수 있습니다 이러한 상황 :

내가 좋아하는 SQLAlchemy의 캐싱에 대한 몇 가지 질문이 있었다는 것을 알고? SQLAlchemy는 이전에 데이터를 가져온 상태로 유지하고 응용 프로그램이 다시 시작될 때까지 새로운 쿼리를 수행하지 않는 것 같습니다. 어떻게 이러한 행동을 피할 수 있습니까?

+0

데이터베이스의 데이터를 어떻게 변경하고 있습니까? 그것은 바뀌 었습니까? – icecrime

+0

나는 그것을 수동으로 바꾼다. 데이터베이스 엔진은 MySQL입니다. 예, 변경 사항이 적용됩니다. – Archarius

+0

http://stackoverflow.com/a/15788051/497208 유용 할 수 있습니다. –

답변

1

몇 가지 가능성이 있습니다.

  1. 부적절하거나 부적절한 경우에 session을 재사용하고 있습니다. 가장 좋은 방법은 커밋 한 후에 session을 버리고 사용하기 전에 마지막 순간에 새 것을 얻는 것입니다. 실제로 캐싱중인 것으로 보이는 동작은 응용 프로그램에서 매우 오래 지속되는 session 수명 때문일 수 있습니다.
  2. session보다 오래 생존하는 개체는 다음 session으로 병합되지 않습니다. "메타 데이터"를 다시 병합하지 않으면 상태를 업데이트하지 못할 수도 있습니다. 이것은 SQLAlchemy의 ORM API에 대해 더 많은 관심사입니다. SQLAlchemy는 지금까지 사용하지 않는 것으로 보입니다.
  3. 변경 사항이 커밋되지 않았습니다. 당신은 그들이 이것이 우리가 아니라고 가정 할 것이라고 말합니다. 그러나 다른 길들 중 어느 것도 그것을 설명하지 않는다면 다시 보길 원할 것입니다.

하나 일반적으로 디버깅 팁 : 당신은 SQLAlchemy의 데이터베이스에 일을 정확히 알고 싶은 경우 create_engine 기능에 echo=True를 전달합니다. 엔진은 실행되는 모든 쿼리를 인쇄합니다.

또한 check out this suggestion ORM을 사용하고 트랜잭션 문제가있는 다른 사람에게 내가 그 문제를 정확히 지적하지 않고 문제를 해결했습니다. 어쩌면 그것은 당신을 도울 것입니다.

9

session.expire_all()을 호출하면 세션에서 데이터베이스가로드 된 모든 데이터가 제거됩니다. 객체 속성에 대한 모든 액세스는 새 SELECT 문을 내 보내고 새 데이터를 다시 가져옵니다. 배경은 http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiring을 참조하십시오.

expire_all()을 호출 한 후에도 여전히 "캐싱"이 표시되는 경우 위에 링크 된 answer에 설명 된대로 트랜잭션을 닫아야합니다.

관련 문제