OperationalError,没有这样的列。姜戈
Posted
技术标签:
【中文标题】OperationalError,没有这样的列。姜戈【英文标题】:OperationalError, no such column. Django 【发布时间】:2014-12-06 09:05:25 【问题描述】:我对 django 非常陌生,并且能够在 djangoproject.com 上完成教程而没有任何错误。我现在正在阅读位于http://www.django-rest-framework.org/ 的 Django REST 框架教程 我几乎完成了它,只是添加了身份验证。现在我得到了:
OperationalError at /snippets/
no such column: snippets_snippet.owner_id
Request Method: GET
Request URL: http://localhost:8000/snippets/
Django Version: 1.7
Exception Type: OperationalError
Exception Value:
no such column: snippets_snippet.owner_id
Exception Location: /Users/taylorallred/Desktop/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 485
Python Executable: /Users/taylorallred/Desktop/env/bin/python
Python Version: 2.7.5
Python Path:
['/Users/taylorallred/Desktop/tutorial',
'/Users/taylorallred/Desktop/env/lib/python27.zip',
'/Users/taylorallred/Desktop/env/lib/python2.7',
'/Users/taylorallred/Desktop/env/lib/python2.7/plat-darwin',
'/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac',
'/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac/lib-scriptpackages',
'/Users/taylorallred/Desktop/env/Extras/lib/python',
'/Users/taylorallred/Desktop/env/lib/python2.7/lib-tk',
'/Users/taylorallred/Desktop/env/lib/python2.7/lib-old',
'/Users/taylorallred/Desktop/env/lib/python2.7/lib-dynload',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
'/Users/taylorallred/Desktop/env/lib/python2.7/site-packages']
Server time: Sat, 11 Oct 2014 07:02:34 +0000
我在网上找了几个地方,不仅仅是 *** 的解决方案,似乎一般是我的数据库有问题,需要删除它然后重新制作,我已经做了好几次了,教程甚至让我删除数据库并重新制作它。
这是我的models.py
:
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight
LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())
class Snippet(models.Model):
owner = models.ForeignKey('auth.User', related_name='snippets')
highlighted = models.TextField()
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
language = models.CharField(choices=LANGUAGE_CHOICES,
default='python',
max_length=100)
style = models.CharField(choices=STYLE_CHOICES,
default='friendly',
max_length=100)
class Meta:
ordering = ('created',)
def save(self, *args, **kwargs):
"""
Use the 'pygments' library to create a highlighted HTML
representation of the code snippet.
"""
lexer = get_lexer_by_name(self.language)
linenos = self.linenos and 'table' or False
options = self.title and 'title': self.title or
formatter = HtmlFormatter(style=self.style, linenos=linenos,
full=true, **options)
self.highlighted = highlight(self.code, lexer, formatter)
super(Snippet, self).save(*args, **kwargs)
我的serializers.py
:
from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
from django.contrib.auth.models import User
class SnippetSerializer(serializers.ModelSerializer):
owner = serializers.Field(source='owner.username')
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner')
class UserSerializer(serializers.ModelSerializer):
snippets = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = User
fields = ('id', 'username', 'snippets')
我的views.py
:
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
from django.contrib.auth.models import User
from snippets.serializers import UserSerializer
from rest_framework import permissions
class SnippetList(generics.ListCreateAPIView):
"""
List all snippets, or create a new snippet.
"""
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def pre_save(self, obj):
obj.owner = self.request.user
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
"""
Retrieve, update or delete a nippet instance.
"""
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def pre_save(self, obj):
obj.owner = self.request.user
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class UserList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
最后是我的urls.py
from django.conf.urls import include
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views
urlpatterns = patterns('',
url(r'^snippets/$', views.SnippetList.as_view()),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
url(r'^users/$', views.UserList.as_view()),
url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
urlpatterns += patterns('',
url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework')),
)
如果我发布了一堆不必要的信息,我深表歉意。在此先感谢各位。
编辑: 数据库架构:
CREATE TABLE "snippets_snippet" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"created" datetime NOT NULL, "title" varchar(100) NOT NULL, "code" text NOT NULL,
"linenos" bool NOT NULL, "language" varchar(100) NOT NULL, "style" varchar(100) NOT NULL);
在进行了一些挖掘之后,我发现在删除和重新创建数据库时(如教程所述)而不是使用 make migrations
命令,它不仅不会添加列,而且它也不会告诉我出现问题时运行make migrations
命令它告诉我:
You are trying to add a non-nullable field 'highlighted' to snippet without a default;
we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
如果我注释掉models.py
中的highlighted
部分,它将在上面发布相同的消息,但针对owner
行。所以它想要highlighted
和owner
的默认值,但我不确定该使用什么。以及教程对我也没有帮助。
【问题讨论】:
如果您删除了 db 并重新运行了 syncdb,我不希望您遇到这个问题。你确定你删除了正确的 SQLite db 文件吗? 我赞成你的问题,不是因为问题本身,而是因为你所尝试的细节的彻底性和坦率。精心提出的问题并不常见。不幸的是,我在移动设备上,无法给出适当的回应。还是祝你好运。我稍后再回来看看事情进展如何 我不知道我可能删除了错误的数据库。我每次运行命令rm tmp.db
,然后运行python manage.py syncdb
,它会提示我创建一个超级用户。我在完成项目其余部分的同一终端选项卡中执行此操作,同时也在同一环境中。
那么其他任何机构都有可能的解决方案吗?
我也有这个问题,无法解决。克隆教程 git 并运行同步似乎会在 sqllite 中创建 owner_id 字段,但我无法通过教程完成它。
【参考方案1】:
在阅读本教程时,您一定遇到过关于迁移的部分,因为这是 Django 1.7 的主要变化之一
在 Django 1.7 之前,syncdb 命令从未进行任何有机会破坏数据库中当前数据的更改。这意味着,如果您为模型执行了 syncdb,然后向模型添加了一个新行(实际上是一个新列),syncdb 不会影响数据库中的该更改。
因此,要么您手动删除该表,然后再次运行 syncdb(从头开始重新创建它,丢失任何数据),要么您在数据库中手动输入正确的语句以仅添加该列。
然后出现了一个名为 south
的项目,该项目实施了迁移。这意味着有一种方法可以向前迁移(以及反向、撤消)对数据库的任何更改并保持数据的完整性。
在 Django 1.7 中,south
的功能直接集成到 Django 中。使用迁移时,过程有点不同。
-
更改
models.py
(正常)。
创建迁移。这会生成代码以从模型的当前状态转到下一个状态。这是通过makemigrations
命令完成的。这个命令足够聪明,可以检测到发生了什么变化,并会创建一个脚本来影响数据库的变化。
接下来,您使用migrate
应用该迁移。此命令按顺序应用所有迁移。
因此,您的正常syncdb
现在是一个两步过程,python manage.py makemigrations
然后是python manage.py migrate
。
现在,谈谈您的具体问题:
class Snippet(models.Model):
owner = models.ForeignKey('auth.User', related_name='snippets')
highlighted = models.TextField()
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
language = models.CharField(choices=LANGUAGE_CHOICES,
default='python',
max_length=100)
style = models.CharField(choices=STYLE_CHOICES,
default='friendly',
max_length=100)
在此模型中,您有两个字段 highlighted
和 code
是必需的(它们不能为空)。
如果您从一开始就添加了这些字段,不会因为表没有现有行而出现问题吗?
但是,如果表已经创建并且您添加了一个不能为空的字段,您必须定义一个默认值以提供任何现有的行 - 否则,数据库将不会接受您的更改,因为它们会违反数据完整性约束。
这就是命令提示您的内容。您可以告诉 Django 在迁移期间应用默认值,或者您可以在模型本身中给它一个“空白”默认值highlighted = models.TextField(default='')
。
【讨论】:
你说的有道理,但是,如果我删除表,它不应该也解决问题吗?因为我要重新创建表格,所以这些字段从一开始就在那里?但在实践中(至少当我这样做时,我认为我做得对......)它仍然不起作用,但是现在,当我运行makemigrations
命令时,它说一切都很好并且“没有变化检测到”,但是当我进入 shell 并查看 db 架构时,它仍然没有显示 owner
或 highlighted
字段。
如果删除了表,需要重新迁移。在你的应用中应该有一个名为 migrations 的文件夹,看看有多少个迁移。
教程声明实际上删除了 sqlite 文件,然后运行 syncdb 重新创建它。即使在这种情况下,该字段也没有在 sn-ps_sn-p 表中创建。
所以目前我模型中的字段看起来像 owner = models.ForeignKey('auth.User', related_name='snippets')
和 highlighted = models.TextField()
他们应该看起来像 owner = models.ForeignKey('auth.User', related_name='snippets', default='')
和 highlighted = models.TextField(default='')
吗?
好的,到目前为止,它似乎工作正常,我完成了对上一条评论中的字段的更改。在最低限度,它让我继续学习教程并且没有给我任何错误,仍然不能 %100 确定这是否完全解决了问题,但到目前为止还不错。如果我遇到与此问题一致的任何其他问题,我将在此处发布更新,否则如果我有另一个我无法解决的问题,我将发布另一个问题。感谢大家的帮助!【参考方案2】:
让我们关注错误:
异常值: 没有这样的列:sn-ps_sn-p.owner_id
让我们看看这是不是真的......
您可以使用manage.py 命令来access your db shell(这将使用settings.py 变量,所以您一定要连接到正确的)。
manage.py dbshell
您现在可以通过键入以下内容来显示表格的详细信息:
.schema TABLE_NAME
或者在你的情况下:
.schema sn-ps_sn-p
更多 sqlite 命令可以在here 或通过发出:
.帮助
最后,键入以下内容结束会话:
.退出
这不会让你走出困境,但它可以帮助你了解问题的最终结果:)
祝你好运!
【讨论】:
非常感谢您向我展示了如何访问 sqlite shell(或任何已配置的 shell)......非常棒,不知道为什么我没有早点了解这一点。 ..谢谢!【参考方案3】:第 1 步:删除 db.sqlite3 文件。
第 2 步:$ python manage.py 迁移
第 3 步:$ python manage.py makemigrations
第四步:使用 $ python manage.py createsuperuser 创建超级用户
新的 db.sqlite3 会自动生成
【讨论】:
你救了我的命哈哈谢谢【参考方案4】:我看到我们在这里遇到了同样的问题,我也遇到了同样的错误。我想为将来遇到同样错误的用户写这篇文章。 像@Burhan Khalid 所说的那样对您的类 Snippet 模型进行更改后,您必须迁移表:
python manage.py makemigrations snippets
python manage.py migrate
这应该可以解决错误。 享受吧。
【讨论】:
【参考方案5】:如果您实例化依赖于该表的类(例如在 views.py 中),则可能会发生此错误。
【讨论】:
非常有帮助 - 如果可以的话,我会给你更多的 +1。我正在练习使用 Django 模型创建对象,并在views.py
中手动实例化了一些类实例,而不是通过表单提交等。一旦我删除了这些创建事件,我就能够在 makemigrations
和 migrate
没有django.db.utils.OperationalError: table project_app has no column named field_trying_to_add
错误。谢谢!
你能解释更多吗?
@istiaque-ahmed 当我在整个应用程序级别使用模型实例化一个类时,我发生了这个错误。迁移机制无法在运行时检查属性,也无法对特定模型/表执行更改。【参考方案6】:
最初,我已经注释了导致这些错误的新字段,然后运行 python manage.py makemigrations 然后 python manage.py migrate 以实际删除这些新字段字段。
class FootballScore(models.Model):
team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
# match_played = models.IntegerField(default='0')
# lose = models.IntegerField(default='0')
win = models.IntegerField(default='0')
# points = models.IntegerField(default='0')
class FootballScore(models.Model):
team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
match_played = models.IntegerField(default='0')
lose = models.IntegerField(default='0')
win = models.IntegerField(default='0')
points = models.IntegerField(default='0')
然后我重新取消注释它们并运行 python manage.py makemigrations 和 python manage.py migrate 并繁荣。它对我有用。 :)
【讨论】:
被低估的答案。 为我工作!谢谢,也许是那些导致问题的依赖项。【参考方案7】:我遇到了这个问题,这就是我解决它的方法。
1) 从应用的迁移目录中删除所有迁移记录。这些是名为 0001_,0002_,0003_ 等的文件。注意不要删除 _init__.py 文件。
2) 删除 db.sqlite3 文件。稍后会重新生成。
现在,运行以下命令:
python manage.py makemigrations appname
python manage.py migrate
请务必在 makemigrations 之后写下您的应用名称。您可能必须创建一个超级用户才能再次访问您的数据库。通过以下方式进行操作
python manage.py createsuperuser
【讨论】:
感谢您在进行迁移时声明 appname 也是必需的。这有帮助。【参考方案8】:解决此类问题最直接的方法就是以下三个步骤:
从应用的迁移文件夹/目录中删除所有与迁移相关的文件(这些基本上以0001
、0002
、0003
等开头)。
从 App 目录中删除/重命名名为 db.sqlite3 的现有数据库文件。
现在运行以下命令:
python manage.py migrate
最终执行
python manage.py createsuperuser
执行管理任务(如果需要)。
【讨论】:
真希望有更快的方法来做到这一点。再说一遍,你可以编写一个脚本来自动化这个过程【参考方案9】:你做的每件事都是正确的,我也遇到了同样的问题。
首先删除你的数据库和迁移
我解决了我在makemigrations
中添加应用程序的名称:
python manage.py makemigrations appname
python manage.py migrate
这肯定会奏效。
【讨论】:
假设它是mysql
db 而不是sqlite3
?【参考方案10】:
我做了以下
-
删除我的 db.sqlite3 数据库
python manage.py makemigrations
python manage.py migrate
它更新了数据库并修复了问题,而不影响我的项目。请注意,您可能需要执行python manage.py createsuperuser
,因为它会影响您正在创建的所有对象。
【讨论】:
【参考方案11】:1.首先从迁移文件中只删除0001_initial.py
2.删除dbsqulite文件
3.python manage.py makemigrations appname
4.python manage.py 迁移
终于解决了
【讨论】:
【参考方案12】:取自 Burhan Khalid 的回答和他对迁移的评论:对我有用的是删除“迁移”文件夹的内容以及数据库,然后运行 manage.py migrate。删除数据库是不够的,因为迁移文件夹中保存了有关表结构的信息。
【讨论】:
【参考方案13】:同意瑞诗凯诗。我也试图解决这个问题很长时间。这将通过两种方法中的一种或两种方法解决-
1.尝试删除应用迁移文件夹中的迁移(init.py除外) 然后运行 makemigrations 命令
2.如果这不起作用,请尝试重命名模型(这是最后的手段,可能会有点混乱,但肯定会工作。如果 django 询问“你重命名模型了吗?只需按 N。”) .希望它有所帮助..:)
【讨论】:
【参考方案14】:您没有迁移在模型中所做的所有更改。所以
1)python manage.py makemigrations
2)python manage.py migrate
3)python manag.py runserver
它工作 100%
【讨论】:
【参考方案15】:这可能是最烦人和最耗时的问题之一,回溯对解决问题没有帮助。
当我们尝试连接模型时,基本上有两种方式:第一个
from comments.models import Comment
class Article(models.Model):
comments = models.ManyToManyField(Comment)
第二个
class Article(models.Model):
comments = models.ManyToManyField('comments.Comment')
第一种方法,初学者广泛使用,它可能会导致循环导入问题,当您尝试在B.py
中导入A.py
时会发生这种情况,在B.py
中它也会导入@987654326 @。
因此,我们必须放弃第一种方法,而实施第二种方法。这是解决问题的方法,不幸的是您需要删除数据库。
删除db.sqlite3
对于所有应用,打开migration
文件夹,删除除__init__.py
之外的所有应用
python manage.py makemigrations
python manage.py migrate
一个问题解决了,如果你遵守约定,这个问题就不会再发生了:
不要导入模型,无论您身在何处,始终使用它:from django.apps import apps
apps.get_model(app_name, model_name)
# Article = apps.get_model('articles', 'Article')
在字段中可以简述为字符串,<app_name>_<model_name>
class Article(models.Model):
comments = models.ManyToManyField('comments.Comment')
这是一个删除所有迁移的脚本,创建一个文件clean.py
与manage.py
同级
import os
def recursor(dirpath):
# print(dirpath)
delfiles = []
deldirs = []
with os.scandir(dirpath) as l1:
for e1 in l1:
if not e1.is_file():
with os.scandir(e1.path) as l2:
for e2 in l2:
if e2.name == 'migrations':
with os.scandir(e2.path) as l3:
for e3 in l3:
if not e3.name == '__init__.py':
print(e3.path)
if e3.is_file():
delfiles.append(e3.path)
else:
deldirs.append(e3.path)
with os.scandir(e3.path) as l4:
for e4 in l4:
delfiles.append(e4)
yn = input('are you sure to delete all the files above?(y/n)')
if yn == 'y':
for dp in delfiles:
os.remove(dp)
for dp in deldirs:
os.rmdir(dp)
recursor(os.path.dirname(os.path.realpath(__file__)))
【讨论】:
【参考方案16】:如果您的问题与我的类似,那么这是一种解决方法。 好消息是您不必删除数据库。
检查是否没有其他模型将此模型用作参考。
django.db.utils.OperationalError: no such column: parts_part_type.blah
这只是发生在我身上,因为我在另一个名为“products”的应用中有另一个名为“product”的模型引用了这个模型。
part = models.ForeignKey("parts.Part", related_name="some part", limit_choices_to='part_type':Part_Type.objects.get(prefix='PART'),)
我的解决方案是:
-
从 settings.py 中注释掉另一个应用程序(在本例中为产品)
python manage.py makemigrations; python manage.py migrate
取消注释其他应用,使其再次启用。
python manage.py makemigrations; python manage.py migrate
从技术上讲,我认为我需要更改 limit_choices_to
引用所以
【讨论】:
所以这是一个 django 错误,它不是由不正确的用户行为引起的【参考方案17】:我最近遇到了这个问题,即使在不同的教程中。我有 django 版本 2.2.3 所以我认为我不应该有这种问题。
在我的例子中,一旦我向模型添加一个新字段并尝试在admin
中访问它,它会说no such column
。
经过三天寻找解决方案但没有任何效果,我学会了“正确”的方法。
首先,如果您要更改模型,您应该确保服务器没有运行。这就是导致我自己的问题的原因。
而这并不容易纠正。我不得不重命名该字段(当服务器未运行时)并重新应用迁移。
其次,我发现python manage.py makemigrations <app_name>
捕获了变化,而不仅仅是python manage.py makemigrations
。我不知道为什么。
您也可以使用python manage.py migrate <app_name>
跟进。我很高兴我自己发现了这一点。
【讨论】:
【参考方案18】:请记住,迁移文件夹中隐藏了一个 pycache 文件夹,因此如果您更改模型并删除所有迁移文件,您还必须删除 pycache 文件夹。
您唯一不应该删除的是您的 init 文件。
希望对你有帮助
【讨论】:
【参考方案19】:就我而言,在admin.py
中,我从添加了新ForeignKey
字段的表中进行查询。所以注释掉 admin.py
然后像往常一样运行 makemigrations 和 migrate 命令。最后取消注释admin.py
。
【讨论】:
【参考方案20】:如果按照@Burhan Khalid 所说的操作后错误仍然存在
试试这一行:python manage.py migrate --run-syncdb
【讨论】:
请正确格式化代码,click here to learn how。另外,不要将您的答案链接到其他人的答案,因为它可以被删除,一旦您有足够的 [reputation](***.com/help/),您可以留下 [comment](***.com/help/privileges/comment)什么声誉)。【参考方案21】:任何人来这里:
删除所有迁移 删除 db.sqlite 文件
重做迁移
【讨论】:
【参考方案22】:我只是犯了一个粗心的错误,在进行迁移后忘记实际应用迁移(迁移)。写这个以防万一有人犯同样的错误。
【讨论】:
【参考方案23】:我认为您跳过了这一步...运行以下命令以查看您是否忘记执行它们...它对我有用。
$ python manage.py makemigrations
$ python manage.py 迁移
谢谢。
【讨论】:
有人已经回答了这个答案。你的回答增加了什么? 它似乎是相同的或只是this、this、this、this 和this 的子集【参考方案24】:删除 django 应用程序的迁移文件夹中的所有迁移,然后运行 makemigrations 和迁移命令。你应该能够走出困境。
【讨论】:
【参考方案25】:我对 sqlite 有同样的问题。我的 models.py 看起来还不错。我做了以下事情:
sqlite3 db.sqlite3
.tables
PRAGMA table_info(table_name);
通过 PRAGMA 我能够看到表中缺少列失败。 我删除了应用程序中的所有表格。请小心,因为这会丢失表格中的数据。
DROP table table_name
.quit
然后这样做:
python manage.py makemigrations your_app
python manage.py migrate your_app
python manage.py sqlmigrate your_app 0001
然后如下再次进入sqlite,粘贴你从sqlimigrate得到的所有代码:
sqlite3 db.sqlite3
例如,这是我在 sqlite 中粘贴的内容:
CREATE TABLE "adpet_ad" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(200) NOT NULL, "breed" varchar(30) NULL, "weight" decimal NULL, "age" integer NULL, "text" text NOT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "picture" BLOB NULL, "content_type" varchar(256) NULL, "name" varchar(100) NULL, "phone" varchar(31) NOT NULL, "gender_id" integer NULL REFERENCES "adpet_gender" ("id") DEFERRABLE INITIALLY DEFERRED, "owner_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "size_id" integer NULL REFERENCES "adpet_size" ("id") DEFERRABLE INITIALLY DEFERRED, "specie_id" integer NULL REFERENCES "adpet_specie" ("id") DEFERRABLE INITIALLY DEFERRED, "sterilized_id" integer NULL REFERENCES "adpet_sterilized" ("id") DEFERRABLE INITIALLY DEFERRED, "vaccinated_id" integer NULL REFERENCES "adpet_vaccinated" ("id") DEFERRABLE INITIALLY DEFERRED);
【讨论】:
【参考方案26】:不要像某些人所说的那样删除任何现有的迁移,而是这样做:
python manage.py migrate --fake #(only if the below commands don't work)
python manage.py migrate --run-syncdb
python manage.py runserver makemigrations
python manage.py runserver
【讨论】:
【参考方案27】:我添加这个是因为,如果您的问题仍然存在,则可能是您试图在类的 init 函数中访问数据库。 makemigrations 进程会检查您的所有模块和类,如果您尝试在 init 函数中访问数据库中的表,它可能会引发错误。注释掉该行,然后尝试 makemigrations 和 migrate
【讨论】:
【参考方案28】:每当您添加新字段时,您也需要在数据库中进行更改,因此您需要运行一些命令来添加新列
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
如果仍然无法正常工作,请删除名称以 00 开头的类似名称的迁移文件,然后从上面运行相同的命令。如果它仍然无法正常工作。从项目中删除 SQLite 数据库并再次运行这些命令
【讨论】:
【参考方案29】:好吧,我不能特别谈到问题的 db 方面或答案......我尝试删除 0001_initial.py 但错误仍然存在。
所以对于你们(我们)中遇到“no such column: sn-ps_sn-p.owner_id”类型的 django 错误(不一定是 REST),问题出在外键变量,它需要一个未指定的默认值。
解决方案:将default=''
添加到外键参数中,就可以了。有关此人代码的上下文; owner = models.ForeignKey('auth.User', related_name='snippets', default='')
【讨论】:
【参考方案30】:我也面临同样的问题。
如果您要添加一个新字段,那么它会给出错误,因为找不到列。
然后你应用make migration
命令,然后应用migrate
命令
然后还是一样的错误..
比如...
path=models.FilePathField()
为字段添加默认值
path=models.FilePathField(default='')
然后应用命令
python manage.py makemigrations
python manage.py migrate
也许对你有帮助
【讨论】:
以上是关于OperationalError,没有这样的列。姜戈的主要内容,如果未能解决你的问题,请参考以下文章
django.db.utils.OperationalError:(1052,“字段列表中的列'名称'不明确”)
sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表:mytable
django:sqlite3.OperationalError:没有这样的表
Django / sqlite3“OperationalError:没有这样的表”关于线程操作
OperationalError:没有这样的表:django_content_type 和 django_session