Django OperationalError'没有这样的列:'sqlite

时间:2020-05-01 20:28:00

标签: python django sqlite

对于我的基本Django CMS,我尝试添加切换功能来发布/取消发布博客文章(我将我的应用称为“文章”,并且模型内部的类对象为is_published) ,尝试使用管理仪表板添加论文内容时遇到了OperationalError。我希望能够切换一个复选框以进行发布/取消发布,但是现在我什至无法访问仪表板。

这是我的Django服务器回溯的一部分:

File "/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: essays_essayarticle.is_published

调试回溯加强了上面的OperationalError:

OperationalError at /admin/essays/essayarticle/
no such column: essays_essayarticle.is_published

Request Method: GET
Request URL: http://<DN>.ngrok.io/admin/essays/essayarticle/
Django Version:2.2.11
Exception Type: OperationalError
Exception Value:
no such column: essays_essayarticle.is_published
Exception Location:
/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py in execute, line 383
Python Executable:
/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/bin/python
`Fri, 1 May 2020 19:37:31 +0000

异常值表示“无此列”,这是对我的数据库的引用。我正在运行SQlite3进行测试。在执行OperationalError之前,我正在对DummyNode和“ isinstance django.db.migrations.exceptions.NodeNotFoundError:迁移”的问题进行故障排除。我到达的先前解决方案是在两个应用程序中删除迁移。这样的答案是解决问题的特定解决方案:https://stackoverflow.com/a/56195727/6095646

根据 @Laila Buabbas 的建议,为澄清起见,我删除了自己的迁移目录,并为我的两个应用程序分别调用了python manage.py makemigrations app_name。这样以前的SQLite问题已解决。但是我无法找出上述新的OperationalError。

问题出在我的views.py / models.py(在下面复制)吗?我无法将范围缩小到更具体的范围。这是我的应用程序的models.py中定义的类的一部分(最后添加了新的潜在问题行):

class EssayArticle(models.Model):
   title = models.CharField(max_length=256)
   web_address = models.CharField(max_length=256)
   web_address_slug = models.SlugField(blank=True, max_length=512)
   content = models.TextField(blank=True)
   is_published = models.BooleanField(default=True)

以下是我views.py中适用功能的相关行:

def article(request, web_address):
   try:
       article = EssayArticle.objects.get(
           web_address_slug=web_address)  # .filter(is_published=True)
   except EssayArticle.DoesNotExist:
       raise Http404('Article does not exist!')
   context = {
       'article': article,
   }
   return render(request, 'essays/article.html', context)

注释我们的.filter(is_published=True)不会停止或更改调试错误。

我的本​​地开发箱是带有Django v2.2.11的Manjaro Linux。我正在运行Python v3.8.2。

以下是我已经利用的一些资源:

3 个答案:

答案 0 :(得分:2)

您数据库的essays_essayarticle表中没有is_published列,尝试通过添加新迁移在db中添加列,并查看表的更改是否要添加此列。

该错误不在您的视图中,而是在查询中。

答案 1 :(得分:1)

看起来您的同名迁移已被触发,这就是Django无法创建新列的原因,

您必须查看数据库中的表django_migrations,然后删除迁移记录。您需要将迁移与数据库中的django_migrations进行比较,然后才发现问题/错误

从数据库中的django_migrations删除迁移后,运行迁移

./manage.py migrate

那么您的问题可能会得到解决

答案 2 :(得分:0)

我假设您已删除了Migrations文件夹,如果这样,在进行迁移和迁移时,请在末尾写下您的应用名称

示例

python manage.py makemigrations app_name