django: sqlite3.OperationalError: нет такой таблицы - PullRequest
9 голосов
/ 07 декабря 2011

Теперь я не знаю почему, но изо дня в день у меня возникали проблемы, когда я пытался запустить тесты.Я использую Django 1.1 (требования клиента), и когда я запускаю тест с:

python manage.py test --setting=settingsTest

, он выдает:

Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 362, in execute_manager
    ...
  File "/usr/lib/pymodules/python2.6/django/db/backends/sqlite3/base.py", line 193, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: programas_act_actividadesprograma

, но у меня есть в settingsTest.py

INSTALLED_APPS = (
    'django.contrib.auth',
    ...

    'site.programas_act',
    ...
)

и в /var/www/site/programas_act/models.py

class ActividadesPrograma(models.Model):
    ...

Я удалил файл, указанный в settingsTest.DATABASE_NAME, и запустил:

python manage.py syncdb --setting=settingsTest

, но все ещесбой.

Если я запускаю в django shell_plus:

import settings
print settings.INSTALLED_APPS
for app in settings.INSTALLED_APPS:
    print app

Я вижу приложение, но при запуске:

from django.db import connection
cursor = connection.cursor()
qry="""SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1"""
cursor.execute(qry)
results = cursor.fetchall()
for tablename in results:
    print tablename

Я не могу найти этоtablename.

Кто-нибудь может мне помочь?

Спасибо

Ответы [ 4 ]

6 голосов
/ 23 марта 2013

У меня тоже была эта проблема.Оказалось, что мне нужно было добавить свойство TEST_NAME в файл settings.py, чтобы правильно идентифицировать тестовую базу данных.Это решило проблему для меня:

if 'test' in sys.argv:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
            'TEST_NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
        }
    }
4 голосов
/ 01 марта 2012

Это тесты Селена, случайно? Эта страница говорит о том, что вам нужно определить TEST_NAME для вашей базы данных, потому что по какой-то причине база данных в памяти довольно повреждена.

1 голос
/ 09 декабря 2018

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

0 голосов
/ 07 декабря 2011

Я думаю, что «manage.py test» начинается с пустой базы данных, поэтому нет никакого способа, как «syncdb» может вам помочь.

Также я не уверен, что это опечатка только в вашем вопросе, но настройкипараметр называется

--settings

, а не:

--setting

кстати.если вы импортируете настройки в коде, используйте импорт следующим образом:

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