Django:DatabaseError 列不存在
Posted
技术标签:
【中文标题】Django:DatabaseError 列不存在【英文标题】:Django: DatabaseError column does not exist 【发布时间】:2011-06-08 21:45:10 【问题描述】:我在使用 Django 1.2.4 时遇到问题。
这是一个模型:
class Foo(models.Model):
# ...
ftw = models.CharField(blank=True)
bar = models.ForeignKey(Bar, blank=True)
刷新数据库后,我立即使用 shell:
Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from apps.foo.models import Foo
>>> Foo.objects.all()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 67, in __repr__
data = list(self[:REPR_OUTPUT_SIZE + 1])
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 82, in __len__
self._result_cache.extend(list(self._iter))
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 271, in iterator
for row in compiler.results_iter():
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 677, in results_iter
for rows in self.execute_sql(MULTI):
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 732, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 15, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
return self.cursor.execute(query, args)
DatabaseError: column foo_foo.bar_id does not exist
LINE 1: ...t_omg", "foo_foo"."ftw", "foo_foo...
我在这里做错了什么?
更新:如果我注释掉ForeignKey
,问题就消失了。
更新 2:奇怪的是,这个单元测试工作得很好:
def test_foo(self):
f = Foo()
f.save()
self.assertTrue(f in Foo.objects.all())
为什么它可以在这里工作,但不能在 shell 中工作?
更新 3:它在单元测试中起作用但在 shell 中不起作用的原因可能与所使用的不同数据库有关:
settings.py:
DATABASES =
'default':
'ENGINE': 'postgresql_psycopg2',
'NAME': 'foo',
'USER': 'bar',
'PASSWORD': 'baz',
'HOST': '',
'PORT': '',
import sys
if 'test' in sys.argv or True:
DATABASES =
'default':
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'testdb'
更新 4:确认当我使用 SQLite3 作为数据库时,一切正常。
【问题讨论】:
明确地说,您是在空数据库上运行syncdb
,还是手动编辑了架构?您似乎知道修改后的模型不会自动更新表格......但只需确保
我只想 100% 确定这不是现有的数据库问题:您是否删除了 postgres 数据库并重新创建了它?当人们尝试flush
或部分同步数据库时,我肯定看到了挥之不去的问题。我问的原因是因为如果一个简单的 2 字段模型没有在 postgresql_psycopg2 上正确创建列,这会引起恶臭。另外,您是否检查过foo_foo.bar_id
是否存在于dbshell
中?信息越多越好!
"列 foo_foo.bar_id 不存在" - 是否存在包含列 "bar_id" 的表 "foo_foo"?
重置数据库的替代方法(正如 Bjorn 正确指出的那样)是使用 South 进行迁移 - south.aeracode.org/docs/installation.html。它使用起来非常简单,如果您需要分步指南,可以阅读这篇文章:mitchfournier.com/2010/06/23/…
【参考方案1】:
在运行 syncdb 之前尝试完全删除/擦除数据库。
我记得不久前我对外键字段进行了更改时需要这样做。
【讨论】:
django文档中指定syncdb不会修改现有表。因此,如果您使用 syncdb 创建了表,然后通过更改模型修改了一些字段,您将需要删除所有内容:./manage.py reset myapp
可以解决问题。它显然适用于单元测试,因为每次运行都会重新创建表。
如果您不想在每次更改模型后重置数据库,请尝试South。【参考方案2】:
请在删除整个数据库之前阅读此内容
我有同样的问题。请完整阅读异常。我有一个 ModelForm 类,它从我的表中读取来构建一个表单,并且存在异常。我注释掉,然后运行 makemigrations 并完全运行。之后我评论了 ModelForm 类,一切都很完美。
希望这会有所帮助。
【讨论】:
【参考方案3】:我通过将特定表格删除到该问题模型来解决此问题。然后使用:
python manage.py syncdb
如果你使用 PostgreSQL,那么我推荐使用 phppgadmin,它是一个类似于 PHPmyadmin 的 web 界面,用于 mysql。
用户界面的替代品,你可以只做命令行
su postgres #change user to postgres
psql <datebase> #access shell for <datebase> database
\d #list all tables
DROP TABLE "" CASCADE #select a table to drop
\q #exit shell
在 \d 中时,按 q 退出。
【讨论】:
【参考方案4】:如果您使用的是 Django 1.8,您应该创建该列。为确保您正确创建列,找到您在其中创建字段并运行的迁移文件:
./manage.py sqlmigrate app_name migration_name_sans_extension
这将输出创建列的 sql 命令。确保包含处理关系的命令并在数据库控制台中运行这些命令。您不必做任何极端的事情,例如删除表或数据库。
【讨论】:
你能说一下列应该是什么样子吗?例如,我有两个 ForeignKey 列:referred_by 和supported_by,它们都引用用户。然后我会再添加两列:user_referred_by 和 user_supported_by,他们会 REFERENCE User(id)??你能说出这在 1.8 文档中的哪个位置吗? 例如,我仍然收到 django.db.utils.ProgrammingError: column user.referred_by_id 不存在。 除非您指定 to_field 字段,否则列将按 id 引用。我不确定这是否包含在文档中,但有关 FK 字段的信息在这里:docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey 这应该是公认的答案,因为它适用于现代版本的 Django,而所有其他答案真的不适合处理你真的不能放弃的数据库表。【参考方案5】:我遇到了同样的问题,并注意到后端数据库中不存在包含外键的字段。在我创建了这个领域之后问题就消失了(我认为这很奇怪)。 Django 似乎没有创建标记为外键的字段。有什么原因吗?
【讨论】:
以上是关于Django:DatabaseError 列不存在的主要内容,如果未能解决你的问题,请参考以下文章
Django DatabaseError:关系“django_site”
Django如何在DatabaseError后重新连接:查询超时
(DatabaseError: no such table: django_session) Django 1.3 selenium 测试期间的错误
Django DatabaseError timedelta的无效连接器