django:sqlite3.OperationalError:没有这样的表

Posted

技术标签:

【中文标题】django:sqlite3.OperationalError:没有这样的表【英文标题】:django: sqlite3.OperationalError: no such table 【发布时间】:2012-01-15 01:30:42 【问题描述】:

我现在不知道为什么,但是当我尝试运行测试时,从一天到另一天开始出现问题。 我正在使用 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

我找不到那个表名。

谁能帮帮我?

谢谢

【问题讨论】:

如果模型中的表不是由迁移创建的,也会发生这种情况。见:***.com/a/39246325/1551116 【参考方案1】:

就我个人而言,我在运行测试之前忽略了运行makemigrations。 docs 说 migrate 会在测试数据库上自动为您运行,但您需要运行 makemigrations 以反映最新的更改。

【讨论】:

谢谢!当然,我不得不这样做。顺便说一句:如果有可能在“虚拟”测试之前运行它,我会很高兴。否则,在玩代码和测试时,您总是必须创建新的迁移文件【参考方案2】:

我也有这个问题。原来我必须在 settings.py 文件中添加一个 TEST_NAME 属性才能正确识别测试数据库。它为我解决了这个问题:

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'),
        
    

【讨论】:

即使在为NAMETEST_NAME 使用这些设置后,我也会遇到同样的错误 我在 settings.py 数据库中有两个条目。添加“TEST_NAME”为我修复了它。一个可以是 ':memory:' 但不能同时是两者。尝试使用 ':memory:?cache=shared' (根据 SQLite 文档)不起作用。 Python 2.7.8/Django 1.6。 不要这样做!从非内存数据库运行测试将花费很长时间! 答案中重要的是我解决了他或她的问题。您刚刚提到这种运行测试的方法效率低下。这句话并没有使我的回答不正确,所以不应该投反对票。 这不应该是必要的!如果您必须定义 TEST_NAME,则会出现问题【参考方案3】:

这些是 Selenium 测试吗? This page 表示您需要为您的数据库定义一个TEST_NAME,因为由于某种原因,内存中的数据库已经完全损坏了。

【讨论】:

【参考方案4】:

我认为“manage.py test”从空数据库开始,所以“syncdb”无法帮助您。

另外我不确定你的问题是否是错字,但设置参数被称为

--settings

而不是:

--setting

顺便说一句。如果您要在代码中导入设置,请以这种方式使用 import:

from django.conf import settings

【讨论】:

以上是关于django:sqlite3.OperationalError:没有这样的表的主要内容,如果未能解决你的问题,请参考以下文章

Django之路

Django系列

django 错误

mac电脑安装django ,运行django报错解决

Django 大神带你飞系列~走进Django

django的文档