python - "DatabaseError, column does not exist"。但是显示在我的 manage.py sql

标签 python sql django

关于 Django 和 Python:

错误:

Exception Type: DatabaseError Exception Value:
column objects_thing.name_id does not exist LINE 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)

最佳答案

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

关键是,您必须以某种方式更新表格以反射(reflect)您对模型所做的任何更改。该模型不是表格,它只是表格的编程表示。

关于python - "DatabaseError, column does not exist"。但是显示在我的 manage.py sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9218211/

相关文章:

django - 等效于 PowerShell 中的 Bash 别名

c++ - 为什么 C++ 语法如此复杂?

sql - 如何将存储在 varchar2 中的时间转换为 Oracle 中的 24 小时格式?

sql - 如何添加SQL Server 2008管理员

sql - 将 dbcc checkdb 结果存储到文件中

php - 用于 PHP 的类似 Django 的 URL 路由

python - 如何只允许更新1个字段?

python - 为什么我收到 NameError : global name 'spacing' is not defined

python - 有没有办法在 PyCharm 调试器中查看变量内的最后 100 个元素?

python - 同一模型的多个版本的 django 管理页面