【问题标题】:How to resolve "ProgrammingError: Column does not exist" after adding model field添加模型字段后如何解决“ProgrammingError:列不存在”
【发布时间】:2015-02-15 22:21:32
【问题描述】:

我在我的模型中添加了一个“nearbyzips”字段,现在我无法克服这些错误。这些是我采取的步骤。

manage.py sqlclear accounts

manage.py syncdb

我没有从这两个命令中得到任何错误,但是只要运行 manage.py check_permissions,我就会得到:

ProgrammingError:  column accounts.my_profile.nearbyzips" does not exist

出于绝望,我还安装了 South(即使我不想使用它),并按照教程将现有项目转换为使用 South。这也不起作用,因此我从已安装的应用程序中删除了 south,并删除了帐户文件夹中的迁移文件夹。

我对'manage.py sqlclear accounts'的理解是它会删除实际的数据库表,然后syncdb会重建它。这似乎没有做它应该做的事情,它会消除我假设的错误。我所做的只是添加一个模型字段,这应该不难。

还有人有其他建议吗?我已经阅读了无数关于这个主题的堆栈溢出帖子,我正在阅读的唯一真正的解决方案是使用我已经完成的 sqlclear,所以我担心在解决这个问题方面我已经走到了死胡同。

【问题讨论】:

  • sync db 不添加列 - syncdb 只会创建/删除整个表。如果您添加了一个列,您需要添加您自己。如果你想让 django 为你做这件事,你需要使用 south,或者从 1.7 django 迁移开始。

标签: django


【解决方案1】:

manage.py sqlclear 只打印 SQL DROP 运算符,但不执行它们。要真正删除应用程序的表,您需要执行这些 DROP:

python manage.py sqlclear accounts | python manage.py dbshell

要添加列而不删除表,您可以执行sql 命令,然后将字段定义复制到ALTER TABLE 运算符:

echo "ALTER TABLE accounts_my_profile ADD COLUMN nearbyzips CHAR(100);" | python manage.py dbshell

【讨论】:

  • 添加 | python manage.py dbshel​​l 终于做到了。谢谢。
  • 赞美这个答案!我在此找到的所有其他答案都想对数据库做一些可怕的事情。使用 Django 开发非常好,直到我尝试添加第一个外键,然后它开始抱怨幽灵迁移,甚至不再出现在代码中。谢谢@catavaran。 :)
【解决方案2】:

我解决了,如果有人遇到同样的问题:

  1. 你必须用heroku pg:reset DATABASE_URL完全重置你的heroku数据库

  2. heroku run python manage.py syncdb

  3. heroku run python manage.py migrate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2021-09-17
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多