" DatabaseError,列不存在"。但是在我的manage.py sql中显示

时间:2012-02-09 20:25:00

标签: python sql django

关于Django&的Python:

错误:

  

异常类型:DatabaseError       例外价值:
      column objects_thing.name_id不存在       第1行:... s_thing“。”创建“,”objects_thing“。”修改“,”对象......

在我的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)

2 个答案:

答案 0 :(得分:5)

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,然后该表与模型保持一致。

  4. 关键在于,不知何故,您必须更新表格以反映您对模型所做的任何更改。该模型不是表,它只是它的程序化表示。

答案 1 :(得分:1)

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

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

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

相关问题