Obj.objects.filter () зависает - PullRequest
       5

Obj.objects.filter () зависает

0 голосов
/ 27 октября 2019

в моей системе для одной таблицы висит Obj.Objects.filter (). Зависание означает, что python съедает 100% ЦП.

virtualenv Python 3.5.2 Django 2.0.9 Ubuntu (вероятно, 16.04, lsb_release по какой-то причине не работает) Mysql: mysql-server-5.7 (5.7.27-0ubuntu0.16.04.1) mysql-connector-python 8.0.13 список стран 0.1.3

.

Сначала у меня была небольшая команда управления для заполнения таблицы:

def handle(self, *args, **options):
    if not Country.objects.filter():
        for code, name in countries_for_language('en'):
            Country.objects.create(code=code, name=name)
            print('%s ' % code, end='', flush=True)

, которые отлично работают в первый раз, но не во второй.

Пытаясь устранить странную проблему с pdb.set_trace (), я обнаружил, что он зависает здесь:

-> if not Country.objects.filter():
(Pdb) s
--Call--
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(176)__get__()
-> def __get__(self, instance, cls=None):
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(177)__get__()
-> if instance is not None:
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(180)__get__()
-> if cls._meta.abstract:
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(185)__get__()
-> if cls._meta.swapped:
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(194)__get__()
-> return cls._meta.managers_map[self.manager.name]
(Pdb) n
--Return--
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(194)__get__() -> 

-> вернуть cls._meta.managers_map [self.manager.name]

(Pdb) n
--Call--
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(81)manager_method()
-> def manager_method(self, *args, * *kwargs):
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(82)manager_method()
-> return getattr(self.get_queryset(), name)(*args, * *kwargs)
(Pdb) n
--Return--
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/manager.py(82)manager_method()-><QuerySet 
[<C...uncated)...']>
-> return getattr(self.get_queryset(), name)(*args, * *kwargs)
(Pdb) n
--Call--
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/query.py(275)__bool__()
-> def __bool__(self):
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site- packages/django/db/models/query.py(276)__bool__()
-> self._fetch_all()
(Pdb) s
--Call--
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/query.py(1180)_fetch_all()
-> def _fetch_all(self):
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site- packages/django/db/models/query.py(1181)_fetch_all()
-> if self._result_cache is None:
(Pdb) n
> /home/lenovo/.virtualenvs/cotw/lib/python3.5/site-packages/django/db/models/query.py(1182)_fetch_all()
-> self._result_cache = list(self._iterable_class(self))
(Pdb) n
**HANGS**

. Переходя на базу данных, select * from app_country работает без проблем.

Переходя к оболочке, я обнаружил, что:

Country.objects.filter() works fine
[c for c in Country.objects.filter(id__lt==101) works fine (100 
results)
[c for c in Country.objects.filter(id__lt==101) HANGS
[c for c in Country.objects.filter(id__lt==110, id_gt=95) works fine (19 results)
[c for c in Country.objects.filter(id__lt==110, id_gt=5) HANGS

. Мне кажется, что в этой таблице есть ограничение на 100 результатов, но я не знаю почему. Не настоящее ограничение, просто что-то, что заставляет его зависать.

Мой вопрос: что может вызвать эту проблему и как ее исправить?

Конечно, оригинальная команда управления будет работать с дополнительной .exists () , но, тем не менее, это какая-то странная проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...