Запросы Django ORM не в состоянии выбрать новые объекты - PullRequest
5 голосов
/ 11 августа 2011

Настройка:

  • Python-скрипт A вставляет данные в БД каждые 15 минут
  • Python-скрипт B запрашивает последние 5 записей каждые несколько минут

Оба используют ORM django, ту же БД MySQL и одну и ту же учетную запись пользователя БД (тот же файл settings.py)

Проблема:
B может выбрать только записи, вставленные до его запуска.Как будто B работает с замороженной БД, замороженной в данный момент B , впервые подключенной к БД.

Почему?
Могу ли я контролировать это поведение?в джанго?

Ответы [ 3 ]

9 голосов
/ 11 августа 2011

Если вы повторно используете один и тот же объект Manager, вы должны иметь в виду , это кеширование .Чтобы справиться с этим, вам нужно обновить вручную.

Это будет возвращать одинаковые результаты на каждой итерации:

while True:
   same_every_time = AClass.objects.all().order_by('-id')[:5]
   sleep(300)

Чтобы система работала правильно, вам нужно добавить обновление:

while True:
   AClass.objects.update()
   updated_results = AClass.objects.all().order_by('-id')[:5]
   sleep(300)
0 голосов
/ 19 декабря 2017

Я обнаружил этот вопрос о переполнении стека при попытке решить аналогичную ситуацию с помощью тестов Django : в тесте я модифицировал объекты модели Django, но эти изменения не были отражены в базе данных, поэтому программа чтения базывторой поток может обнаружить изменения.Решением было унаследовать мой тестовый класс от TransactionTestCase вместо django.test.TestCase по умолчанию.

0 голосов
/ 11 августа 2011

Django сам по себе использует постоянство, управляемое контейнером. Это означает, что транзакции базы данных фиксируются промежуточным программным обеспечением во время восходящего каскада ответов.

Если вы сами используете Django ORM, вам необходимо обеспечить фактическое совершение транзакции:

from django.db import transaction

def my_task(whatever):
    MyModel.objects.create(...)
    # do whatever
    transaction.commit()
    return 'my_result'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...