首页 > 解决方案 > Django OperationalError:没有这样的列:在 pythonanywhere

问题描述

首先,我能够修复 ImportError。我发现是因为pythonanywhere的Django版本没有更新,所以我将pythonanywhere上的Django从1.xx升级到了2.0.9。

错误是这样出现的:

ImportError at / cannot import name 'path'

django version: 1.x.x
python version: 3.6.6

而且,不幸的是,我的应用程序给了我另一个错误:

OperationalError at / no such column: blog_post.published_date 请求方法:GET 请求 URL:http: //.pythonanywhere.com/ Django 版本:2.0.9 异常类型:OperationalError 异常值:
没有这样的列:blog_post.published_date 异常位置:/ home/
/my-first-blog/myenv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py 在执行,第 303 行 Python 可执行文件:/usr/local/bin/uwsgi Python 版本: 3.6.6

我认为这个错误是由于某些数据库而发生的,所以我尝试了migratemakemigrations在 pythonanywhere 上,但我仍然无法修复它。

那么,有没有人知道如何修复这个数据库?

这是我的model.py

from django.conf import settings
from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

这是输出python manage.py showmigrations

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
blog
 [X] 0001_initial
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

标签: pythondjangooperationalerror

解决方案


我看到的问题必须与数据库和 django 迁移有关。

博客内的Post对象具有 django 试图查找的属性。迁移尚未正确应用于数据库。

现在考虑迁移的历史,我不知道出了什么问题,除非我可以查看您的数据库,我假设它是一个 sqlite。

如果您有一个新构建的数据库,解决此问题的一种方法是删除该数据库并执行以下操作:

  • app/migrations从目录中删除所有迁移
  • python manage.py makemigrations
  • python manage.py migrate

另外,尽量避免sqlite。在数据库上运行的相同迁移sqlite在 Postgres 或 MySQL 数据库上可能是错误的,这些数据库是更多的生产级数据库。

注意:请理解这将导致数据完全丢失。因此,仅当您能够承受现有/测试数据的妥协时,才尝试此操作。


推荐阅读