【问题标题】:Django postgresql foreign keyDjango postgresql 外键
【发布时间】:2012-12-11 00:23:51
【问题描述】:

我有这个models.py

from django.db import models
from django.contrib.auth.models import User

class Service(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=800, blank=False)
    service = models.CharField(max_length=2000, blank=False)
    def __unicode__(self):
        return self.name

class ServiceCheck(models.Model):
    service = models.ForeignKey(Service)
    check_status = models.CharField(max_length=80)
    check_time = models.DateTimeField()

当我对 postgresql 运行 syncdb 时,它会出现错误:

~/dev-md> sudo python manage.py syncdb
Creating tables ...
Creating table monitor_service
Creating table monitor_servicecheck

DatabaseError: Hash/Modulo distribution column does not refer to hash/modulo distribution column in referenced table.

【问题讨论】:

  • 你确定在你的models.py文件中Service和ServiceCheck是按这个顺序定义的吗?我问是因为您的输出应该显示首先创建了 monitor_service 表。
  • 是的 Talvalin 正确的顺序。
  • 还有其他应用吗?这段代码应该可以工作。
  • 正在运行的 SQL 是什么样的?您可以通过运行python manage.py sqlall monitor 来查看
  • 开始; CREATE TABLE "monitor_service" ("id" serial NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "name" varchar(800) NOT NULL, "service" varchar(2000 ) 非空) ; CREATE TABLE "monitor_servicecheck" ("id" serial NOT NULL PRIMARY KEY, "service_id" integer NOT NULL REFERENCES "monitor_service" ("id") DEFERRABLE INITIALLY DEFERRED, "check_status" varchar(80) NOT NULL, "check_time" timestamp with time区域非空);提交;

标签: python django postgresql foreign-keys


【解决方案1】:

代码看起来乍一看还不错。我怀疑这是与数据库相关的问题。

由于提供的 max_lengths 非常大,请尝试将 max_lengths 减少到 TextField 而不是 CharField

如果失败,请尝试在 Service 和/或 ServiceCheck 中重命名字段 service

【讨论】:

    【解决方案2】:

    您遇到的问题实际上与 Postgres-XC/StormDB(或现在的 Postgres-XL,我遇到此问题的地方)如何处理不同数据节点之间的表分区有关。

    基本上,问题在于数据库引擎不能保证外键或唯一约束的约束。根据 StormDB 网站上关于以前版本 Django 和 Postgres-XC/StormDB 的旧 article,您可以通过在数据库上设置 loose_constraints=true 来做到这一点。在现代版本的 Django(1.6 或更高版本)中,等效项似乎是根据 Django 的模型字段文档在 ForeignKey 上设置 db_constraint=False(我无法直接链接到,因为我没有足够的代表)。

    如果您更关心可用性而不是性能,另一种解决方案是复制数据,这意味着您不会遇到问题,因为所有数据节点都具有相同的数据。 我不知道有什么方法可以直接在 Django 中执行此操作,但您可以修改表创建以使用 DISTRIBUTE BY REPLICATION,如 CREATE TABLE 文档中所述。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2021-01-26
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2023-03-14
      • 2021-12-22
      • 2015-04-17
      • 2018-04-13
      相关资源
      最近更新 更多