Django OperationalError: no such column: on pythonanywhere
Django OperationalError: no such column: on pythonanywhere
首先,我能够修复 ImportError。想通了是因为pythonanywhere的Django版本没有更新,于是把Django on pythonanywhere从1.x.x升级到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
Request Method: GET
Request URL: http://.pythonanywhere.com/
Django Version: 2.0.9
Exception Type: OperationalError
Exception Value:
no such column: blog_post.published_date
Exception Location: /home//my-first-blog/myenv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py
in execute, line 303
Python Executable: /usr/local/bin/uwsgi
Python Version: 3.6.6
我认为这个错误是由于某些数据库引起的,所以我在 pythonanywhere 上尝试了 migrate
或 makemigrations
,但我仍然无法修复它。
那么,有谁知道如何修复这个数据库吗?
这是我的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
我看到的问题必须与数据库和 Django 迁移有关。
博客中的 Post
对象具有 django 试图找到的属性。迁移尚未正确应用于数据库。
现在考虑迁移的历史,我不知道出了什么问题,除非我可以查看你的数据库,我假设它是一个 sqlite。
如果您有一个新建的数据库,解决此问题的一种方法是删除数据库并执行以下操作:
- 删除
app/migrations
目录中的所有迁移
python manage.py makemigrations
python manage.py migrate
另外,尽量避免sqlite
。 运行 在 sqlite
数据库上的相同迁移在 Postgres 或 MySQL 数据库上可能是错误的,后者是更多生产级数据库。
注意:请理解这将导致数据完全丢失。因此,仅当您能够承受 existing/test 数据的妥协时才尝试此操作。
如果您想让更改生效,请不要忘记在每次迁移后刷新您的生产服务器
首先,我能够修复 ImportError。想通了是因为pythonanywhere的Django版本没有更新,于是把Django on pythonanywhere从1.x.x升级到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 Request Method: GET Request URL: http://.pythonanywhere.com/ Django Version: 2.0.9 Exception Type: OperationalError Exception Value:
no such column: blog_post.published_date Exception Location: /home//my-first-blog/myenv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py in execute, line 303 Python Executable: /usr/local/bin/uwsgi Python Version: 3.6.6
我认为这个错误是由于某些数据库引起的,所以我在 pythonanywhere 上尝试了 migrate
或 makemigrations
,但我仍然无法修复它。
那么,有谁知道如何修复这个数据库吗?
这是我的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
我看到的问题必须与数据库和 Django 迁移有关。
博客中的 Post
对象具有 django 试图找到的属性。迁移尚未正确应用于数据库。
现在考虑迁移的历史,我不知道出了什么问题,除非我可以查看你的数据库,我假设它是一个 sqlite。
如果您有一个新建的数据库,解决此问题的一种方法是删除数据库并执行以下操作:
- 删除
app/migrations
目录中的所有迁移 python manage.py makemigrations
python manage.py migrate
另外,尽量避免sqlite
。 运行 在 sqlite
数据库上的相同迁移在 Postgres 或 MySQL 数据库上可能是错误的,后者是更多生产级数据库。
注意:请理解这将导致数据完全丢失。因此,仅当您能够承受 existing/test 数据的妥协时才尝试此操作。
如果您想让更改生效,请不要忘记在每次迁移后刷新您的生产服务器