【问题标题】:"DatabaseError, column does not exist". But shows in my manage.py sql“数据库错误,列不存在”。但在我的 manage.py sql 中显示
【发布时间】:2012-03-02 08:34:44
【问题描述】:

关于 Django 和 Python:

错误:

异常类型:DatabaseError 异常值:
列 objects_thing.name_id 不存在 第 1 行:...s_thing"."created", "objects_thing"."modified", "objects...

在我的 manage.py sql 对象中

CREATE TABLE "objects_thing" (
    otherstuff,
    otherstuff,
    "name_id" integer NOT NULL REFERENCES "profiles_name" ("id"),
    otherstuff,
);

所以它显然存在。 我已经运行了syncdb。 为什么我会收到此错误?我该如何修复它? (我是这一切的新手)提前感谢您的帮助。

编辑:

事物模型:

class Thing(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    name = models.ForeignKey(Name)#The name for this thing
    current_allocation = models.DecimalField(max_digits=13, decimal_places=2, null=True, blank=True)
    target_allocation = models.DecimalField(max_digits=13, decimal_places=2, null=True, blank=True)
    placeholder = models.ForeignKey(Entity, null=True, blank=True, on_delete=models.SET_NULL)
    avatar = models.ImageField(upload_to='avatars/thing/', null=True, blank=True)

【问题讨论】:

  • 如果你在这里显示你的代码会更好
  • 编辑,添加模型。不知道你还需要什么。
  • 不,我的意思是您检索数据库的代码。此外,您应该删除当前的对象数据库并手动创建它
  • python manage.py sql objects python manage.py dbshell atler table objects_thing add column "name_id" integer REFERENCES "profiles_name" ("id")

标签: python sql django


【解决方案1】:

syncdb 不会更改数据库中的现有表,因此如果您运行它,然后更改您的模型,您的模型现在与它所代表的表不同步。再次运行 syncdb 将无法解决此问题。

您要么需要使用 south 之类的东西进行迁移,从数据库中删除表以便 syncdb 重新创建它,要么在数据库上手动运行 ALTER TABLE。

编辑(更详细)

当您在models.py 中创建Model 的子类时,它充当数据库表的表示,但不会自动拥有数据库表。你可以通过运行python manage.py syncdb 来获得它。然后,Django 会查看您的所有 models.py 文件,生成实际创建这样的表所需的 SQL,然后在您的数据库上运行它。最终结果是您最终得到了与您的模型相关联的实际数据库表。

但是,syncdb创建 表。它不会改变它们。因此,如果您更改其中一个模型(添加字段、更改字段名称等),数据库级别不会发生任何事情。再次运行syncdb 也无济于事,因为没有 表要创建。但是,您必须以某种方式使表格与模型匹配,反之亦然,这就是您的选择所在:

  1. 使用南方(上面的链接)。 South 使您能够创建迁移,因此当您更改模型上的某些内容时,您可以运行:

    python manage.py schemamigration --auto yourapp
    

    它会生成代码来更改表格以匹配您的模型。然后,您只需应用迁移:

    python manage.py migrate yourapp
    

    你就完成了。该表现在与您的模型匹配,并且一切正常。

  2. 您可以从数据库中手动删除该表。您不希望在生产中执行此操作,因为该表中的所有数据都会随之而来,但在开发中它应该不是问题。表消失后,您可以运行:

    python manage.py syncdb
    

    因为表不再存在,Django 会创建它,但它会根据你当前模型的状态创建它。最终结果是相同的,您的模型和表格匹配,所以您可以开始了。

  3. 您可以手动更改表格。这要求您弄清楚需要应用什么 SQL 来更改表以匹配您的模型。您在数据库上运行此 SQL,然后该表与模型相同。

关键是,您必须以某种方式更新表格以反映您对模型所做的任何更改。模型不是表格,它只是表格的程序化表示。

【讨论】:

  • 我对这一切都不熟悉。 syncdb 将如何重新创建表?我想我不理解整个“从无到有”的概念。
【解决方案2】:

该列可能不一定存在。 sql 命令仅显示用于创建它的 sql,它基于您当前的模型。您可以删除表并重新同步数据库或手动添加列。 https://docs.djangoproject.com/en/dev/ref/django-admin/#sql-appname-appname

我认为关于 django 模型和实际的数据库表存在一些混淆

django 模型只是一些 python 代码。它是一个连接到 sql 表的 python 对象。数据库后端在 settings.py 中指定。数据库包含实际的表。您遇到的错误表明python模型与实际的数据库表不同。

【讨论】:

  • 有点不知道该怎么做。通过手动添加列,您的意思是编辑模型吗?
  • @Modelsq,抱歉,您使用的是什么数据库后端?
  • Django 1.3.1 nginx Postgresql Ubuntu
  • @modelesq,在 postgres shell 中你可以输入\d yourapp_thing,它会告诉你模型的表格是什么样子的。
  • 我该如何解决这个问题。 “手动”这个词已经被折腾了很多次。这是否意味着更改模型以匹配数据库?因为现在,是的,它是 name = .. 在模型中。切换到数据库中的name_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 2014-04-21
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
相关资源
最近更新 更多