Ошибка программирования: (1146, «Таблица 'test_ <DB>. <TABLE>' не существует") при запуске модульного теста для Django - PullRequest
6 голосов
/ 15 апреля 2010

Я запускаю модульное тестирование с использованием инфраструктуры Django и получаю эту ошибку.

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

Код, который выдает ошибку, выглядит следующим образом

member = Member.objects.get(email=email_address)

и модель выглядит как

class Member(models.Model):
    member_id = models.IntegerField(primary_key=True)
    created_on = models.DateTimeField(editable=False, default=datetime.datetime.utcnow())
    flags = models.IntegerField(default=0)
    email = models.CharField(max_length=150, blank=True)
    phone = models.CharField(max_length=150, blank=True)
    country_iso = models.CharField(max_length=6, blank=True)
    location_id = models.IntegerField(null=True, blank=True)
    facebook_uid = models.IntegerField(null=True, blank=True)
    utc_offset = models.IntegerField(null=True, blank=True)
    tokens = models.CharField(max_length=3000, blank=True)
    class Meta:
        db_table = u'member'

Там нет ничего слишком странного, что я вижу.

пользователь, выполняющий тесты, имеет те же права доступа к серверу базы данных, что и пользователь, который запускает веб-сайт

это django 1.1 на mariadb, работающем на osx

    MJ-2:mysite Marsh$ python manage.py test sitecoming
Creating test database...
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table djangodblog_errorbatch
Creating table djangodblog_error
Installing index for djangodblog.ErrorBatch model
Installing index for djangodblog.Error model
E
======================================================================
ERROR: test_index (mysite.sitecoming.tests.SiteComingTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/Marsh/Development/deal/src/mysite/sitecoming/tests.py", line 19, in test_index
    response = c.post('/submit', {'email':'marshall@offby3.com'})
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/test/client.py", line 313, in post
    response = self.request(**r)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/handlers/base.py", line 92, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/Users/Marsh/Development/deal/src/mysite/sitecoming/views.py", line 49, in submit
    member = Member.objects.get(email=email_address)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/manager.py", line 120, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 300, in get
    num = len(clone)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 81, in __len__
    self._result_cache = list(self.iterator())
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 238, in iterator
    for row in self.query.results_iter():
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/sql/query.py", line 287, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 84, in execute
    return self.cursor.execute(query, args)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-macosx-10.3-fat.egg/MySQLdb/cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-macosx-10.3-fat.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
ProgrammingError: (1146, "Table 'test_deal.member' doesn't exist")

----------------------------------------------------------------------
Ran 1 test in 0.447s

FAILED (errors=1)
Destroying test database...

где еще я могу посмотреть, что происходит, почему эта таблица не создается?

update - проблема, по-видимому, заключается в том, что при запуске модульных тестов модели, которые используются для создания тестовой базы данных, поступают из приложения, а не из проекта. это кажется странным поведением и нарушением DRY, так как для того, чтобы он работал, мне нужно дублировать файл модели в каждом приложении, а не централизованно в проекте.

кто-нибудь может подсказать, как обойти это?

** обновление 2 ** - структура проекта выглядит следующим образом:

структура проекта выглядит так:

/mysite (www.whatever.com)
    /application1 (facebook app, handles all urls beginning with /fb)
    /application2 (www app, handles everything else in the root dir of the site)

Я хочу, чтобы функциональность fb была отделена от остальной части сайта, но они имеют одну и ту же базу данных. я делаю это неправильно?

Ответы [ 3 ]

9 голосов
/ 07 декабря 2012

Чтобы устранить эту проблему, сгенерируйте всю вашу таблицу, которая была объявлена ​​в файле settings.py в папке вашего проекта.

Вы можете найти блок INSTALLED APPS в файле настроек.Для этого выполните следующую команду:

manage.py syncdb или python manage.py syncdb

Если это не сработает, задайте переменную окружения PATH для каталога python.

3 голосов
/ 12 апреля 2011

На немного другой ноте, вы определенно не хотите этого:

created_on = models.DateTimeField(…, default=datetime.datetime.utcnow())

Это на самом деле вызывает utcnow(), когда загружается ваш файл models.py (что произойдет, когда вы manage.py runserver), и используете этот единственный момент времени для значения по умолчанию для каждого последующего экземпляра. То, что вы хотите, это:

created_on = models.DateTimeField(…, default=datetime.datetime.utcnow)

Аргумент default может принимать вызываемый объект, который будет вызываться каждый раз, когда для нового экземпляра требуется значение по умолчанию. Посмотрите документацию .

1 голос
/ 04 мая 2011

Вы можете получить больше информации о том, что происходит, добавив -v3 к вашему тесту, то есть:

$ python manage.py test -v3 sitecoming
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...