Django操作错误:缺少表;迁移无法识别缺少的表
我在Django 1.7中遇到了问题,我试图将用户保存到一个表中,但得到了一个错误,即该表不存在 以下是我正在执行的代码:Django操作错误:缺少表;迁移无法识别缺少的表,django,database,sqlite,migration,Django,Database,Sqlite,Migration,我在Django 1.7中遇到了问题,我试图将用户保存到一个表中,但得到了一个错误,即该表不存在 以下是我正在执行的代码: from django.conf import settings from django.contrib.auth import BACKEND_SESSION_KEY, SESSION_KEY, get_user_model User = get_user_model() from django.contrib.sessions.backends.db import Se
from django.conf import settings
from django.contrib.auth import BACKEND_SESSION_KEY, SESSION_KEY, get_user_model
User = get_user_model()
from django.contrib.sessions.backends.db import SessionStore
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, email, *_, **__):
session_key = create_pre_authenticated_session(email)
self.stdout.write(session_key)
def create_pre_authenticated_session(email):
user = User.objects.create(email=email)
session = SessionStore()
session[SESSION_KEY] = user.pk
session[BACKEND_SESSION_KEY] = settings.AUTHENTICATION_BACKENDS[0]
session.save()
return session.session_key
然而,在
user = User.objects.create(email=email)
我收到一条错误信息:
django.db.utils.OperationalError: no such table: accounts_user
下面是accounts/models.py上的用户模型,我正试图使用它来构建表:
from django.db import models
from django.utils import timezone
class User(models.Model):
email = models.EmailField(primary_key=True)
last_login = models.DateTimeField(default=timezone.now)
REQUIRED_FIELDS = ()
USERNAME_FIELD = 'email'
def is_authenticated(self):
return True
我已经使用manage.py accounts 0001.initial运行了sqlmigrate,并且我已经获得了正确的创建表SQL,但是运行manage.py migrate给出了以下信息:
Operations to perform:
Apply all migrations: sessions, admin, lists, contenttypes, accounts, auth
Running migrations:
No migrations to apply.
迁移只是从shell运行“makemigration”的结果,没有自定义代码。我确实看到了包含的应用程序中列出的帐户,但迁移没有运行,因此我的站点处于一个奇怪的位置,Django说当我尝试使用它时,该表丢失了,但是Django说,当我尝试运行迁移来创建它时,它已经存在了。
为什么Django错误地认为,当我可以查看数据库时,它已经存在了,但它没有存在?@user856358您对另一个sqlite文件的评论似乎是根本原因。我遇到了相同的错误,通过删除该文件并运行另一次迁移,问题得到了解决。在我的例子中,该文件是按照
settings.py
中指定的位置定位的:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, '../database/db.sqlite3'),
}
}
通过删除那里的.sqlite3文件,我成功地运行了迁移并解决了无此类表错误
django.db.utils.OperationalError: no such table: accounts_user
$ rm ../database/db.sqlite3
$ python3 manage.py migrate
运行
python manage.py makemigrations--app name
,然后再运行python manage.py migrate
//或者检查您是否伪造了之前的migrate
过程您正在编写Harry Percival的测试驱动设计书,对吗?我遇到了完全相同的问题。埃里克:我想出了一个适合我的解决办法。事实证明,我没有遗漏任何一步,但他放置sql文件的位置与Django自然创建sql文件的位置不同。Django的基本sqlite文件位于src/db.sqlite3下。但是,如果您在src/superlists/db.sqlite3下查看,您会发现另一个sqlite文件是按照BASE_DIR的设置所给出的路径创建的。我怀疑这种差异是因为这本书使用了较旧版本的Django。你如何为你的Django应用提供服务?您确定manage.py和web服务器中的DJANGO\u设置\u模块
相同吗?