в моей системе для одной таблицы висит 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 () , но, тем не менее, это какая-то странная проблема.