7

I have this 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()

When i run syncdb against postgresql it ends up with error:

~/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.
4

2 回答 2

2

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

由于max_length提供的 s 非常大,请尝试将max_lengths 减少到 <= 255 或使用 aTextField而不是 a CharField

如果做不到这一点,请尝试重命名和/或service中的字段。ServiceServiceCheck

于 2013-01-19T09:21:07.253 回答
1

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

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

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

于 2015-01-16T04:55:20.170 回答