2009-12-11 2 views
20

Django 애플리케이션에서 데이터베이스 (예 : 매 10 초)에 동일한 쿼리를 반복적으로 실행합니다. 그런 다음 수신 한 쿼리 세트에서 MD5 합계를 생성하고 이전 실행에서 작성한 MD5 합계와 비교합니다. 둘 다 동일하면 데이터가 변경되지 않고 웹 페이지를 업데이트 할 필요가 없습니다.장고 쿼리 캐시를 비활성화하는 방법은 무엇입니까?

이렇게하는 동안 DB의 데이터가 변경 될 수 있습니다.

그러나 쿼리는 분명히 인해 query caching에, 같은 검색어 세트를 반환합니다.

어떻게하면 쿼리 캐시를 사용하지 않고 DB에서 명시 적으로 쿼리를 실행할 수 있습니까?

+0

가능한 중복 http://stackoverflow.com/questions/3346124/how-do-i-force- django-to-ignore-any-caches-and-reload-data) –

답변

41

나는 캐싱의 일종이라고 생각 행동을 통해 온,하지만 나를 속여 데이터베이스 트랜잭션으로 밝혀졌다.

나는 다른 프로세스에서, 항목이 데이터베이스에 추가됩니다 된 문제가 있고, 나는 다른 프로세스의 진행 상황을 모니터하고 싶었다, 그래서 장고 쉘을 열고 발행 한 다음

>>> MyData.objects.count() 
74674 

>>> MyData.objects.count() 
74674 

값이 실제로 데이터베이스에있는 경우에도 변경되지 않았습니다. 나는 최소한 내가 MySQL & django 셋업을 가지고 있었고 트랜잭션에 있었고 트랜잭션을 열었을 때 데이터베이스의 "스냅 샷"만 볼 것이라고 생각했다.

django에서보기 때문에 autocommit 동작이 정의되었으므로 다음 번에보기가 호출 될 때마다 다른 트랜잭션에서 스냅 샷을 볼 수 있도록 각보기에 적합합니다. 그러나 자동으로 커밋되지 않은 코드 조각의 경우이 트랜잭션에서 만들어진 코드를 제외하고 db의 변경 사항을 볼 수 없습니다.

그냥이 상황에 올 수있는 사람을 위해이 답변을 던질 것이라고 생각했습니다.

는 해결 수동과 같이 할 수있는 트랜잭션을 커밋하려면

>> from django.db import transaction 
>> transaction.enter_transaction_management() 
>> transaction.commit() # Whenever you want to see new data 
+2

대단히 고맙습니다. 대기열을 수신 대기하고 어떤 이벤트를 처리해야하는 명령을 실행할 때이 정확한 동작을 얻었습니다. 프로세서가 실행을 시작한 후 사용자를 찾지 못했을 때 – victorcampos

+1

'transaction.commit_unless_managed()' 나를 위해 일했다. –

+1

과거에 여러 번 성가신 문제에 대한 완벽한 대답! 엄청 고마워. – Sarang

6

당신이 장고 문서로 제공하는 링크는 의미 그 다음 : 당신이 액세스하는 등,

>>> queryset = Poll.objects.all() 
>>> print [p.headline for p in queryset] # Evaluate the query set. 
>>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation. 

쿼리 캐시를 사용

>>> print [e.headline for e in Entry.objects.all()] 
>>> print [e.pub_date for e in Entry.objects.all()] 

는 동안, 데이터베이스에 두 개의 쿼리를 생성 동일한 평가 결과.

9

쿼리 캐싱은 검색어 세트 내에서 적용됩니다. 즉, 같은 쿼리 세트 개체를 두 번 평가하면 쿼리 캐싱이 작동합니다. 그러나 매 10 초마다 쿼리를 수행한다면 아마도 매번 새로운 프로세스를 생성하는 cron을 통해 이루어 지므로 장고가 아무 것도 캐시 할 방법이 없습니다.

정확하게 동일한 쿼리를 반복적으로 수행하는 경우 데이터베이스의 자체 캐시가 작동 할 수 있습니다. DBMS에 대한 문서를 참조하여 올바르게 관리하는 방법을 알아야합니다.

+1

올바른 동안 이것은 django queryset에서 분명하게 지적하는 질문에 대답하지 않습니다. @kekoa 대답은 OP의 질문과 일치합니다. – sberder

1

답장을 보내 주셔서 감사합니다. 답장을 통해 몇 가지 단계를 거쳐 다시 생각해보십시오.

DBMS 수준에서 캐싱을 테스트하기 위해 Django에서 멀리 떨어져서 쉘 스크립트를 사용하여 SQLite db의 데이터를 주기적으로 쿼리하는 데 편리했습니다. 두 번째 셸 세션에서 데이터를 추가했습니다. 새 데이터는 추가 한 직후 주기적 쿼리에 나타 났으므로 여기서 쿼리를 캐싱하지 않습니다.

이렇게하면 장고 부분이 좁아졌습니다. 관련된 코드는 그리 복잡하지 않으며 약간의 로그 출력과 코드 검토로 문제가 드러났습니다. MD5 합계를 만들기 위해 차례로 사용 된 쿼리 세트를 가져 오는 데 사용 된 쿼리에 오류가 있었으며 항상 비어있었습니다. 따라서 MD5 합계는 항상 동일합니다. 실제로 캐시 된 결과처럼 보입니까 - 데이터는 변경되지만 쿼리 세트는 동일하게 유지됩니다. 거기에 표시된 데이터를 얻기 위해 다른 쿼리가 사용되었으므로 문제가 응용 프로그램에 표시되지 않았습니다.

수업은 배운 : 완전히 당황 경우, 다시 걸음을하고 가정을-생각을 다시.

다시 한번 감사드립니다! :-)

0

내가 장고 버전 1.8에서이 문제를 만났다. 직접적인 방법은 없지만 캐시 대신 db에 액세스하여 쿼리 세트를 다시 평가하고 실행하는 몇 가지 방법이 있습니다. 나는 그것을 발견했다 Django Queryset Documentation

나는 나의 문제를 다루기 위해 그 중 하나를 사용했다. 그것은 querysets의 exists() 기능입니다. len()repr()도 사용할 수 있습니다. 그들은 나를 위해 일했습니다.

queryset = ModelClass.objects.filter(....) 
queryset.exists() 

#or len(queryset) 
#or repr(queryset) 

#Now queryset is re-evaluated. 
[I 장고 어떤 캐시를 무시하고 데이터를 다시로드 강제로 어떻게?] (의
관련 문제