Данные модели недоступны для дочернего потока - PullRequest
0 голосов
/ 08 сентября 2011

Я использую Django-1.3 с движком MySQL db.

В настройке для модульного теста (используя manage.py для запуска теста) я создаю объект и сохраняю его.

Если я запрашиваю объект (используя objects.filter) из обработчика ответа, я вижу это нормально. Если я создаю дочерний поток, используя модуль потоков python (threading.Thread), и он пытается выполнить тот же вызов objects.filter, он не видит объект. Почему дочерний поток не видит запись, созданную мной в настройке модульного теста, когда она видна в родительском потоке?

1 Ответ

1 голос
/ 19 сентября 2011

Вам нужно использовать TransactionTestCase вместо обычного TestCase, чтобы сделать это.Если вы этого не сделаете, изменения, которые вы вносите в модель в своем тестовом примере (например, в вашей настройке), фактически не будут зафиксированы в БД, следовательно, не будут видны вашему потоку.См. Документ Django о TransactionTestCase для получения более подробной информации.

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

from django.db import connection    
connection.close()
cursor = connection.cursor()

Это не ваш случай, но если вы используете SQLite, вам также нужно указать TEST_NAME в ваших настройках.Если нет, Django SQLite DB полностью находится в памяти и не может быть разделен между потоками.

Используя этот подход, я мог бы создать живой тестовый сервер в потоке, одновременно управляя селеном и DB из порождающего теста Django.Я взял код потока сервера с здесь

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