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的无效连接器

Django DatabaseError - 没有这样的保存点

尝试重置密码时出现 Djongo + Django + MongoDB Atlas DatabaseError