在Postgresql中限制数据库

时间:2016-02-19 09:47:14

标签: django database postgresql pgadmin hstore

我在Postgresql中使用Django1.9。这是我的模型“功能”的数据模型:

class Feature(models.Model):
    image_component = models.ForeignKey('Image_Component',on_delete=models.CASCADE,)
    feature_value = HStoreField()

    def save(self,*args,**kwargs):
        if Feature.objects.filter(feature_value__has_keys=['size', 'quality' , 'format']):
            super(Feature, self).save(*args, **kwargs)
        else:
            print("Incorrect key entered")

我对feature_value施加限制,以便只有Hstore允许的键是大小格式质量。我可以使用Django-Admin更新数据库时执行此操作。但是我无法使用具有相同限制的pgAdmin3直接更新数据库,即我想对数据库级别施加相同的限制。我怎样才能做到这一点?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您需要ALTER Future个表格,并为feature_value字段添加constraint此类查询:

ALTER TABLE your_feature_table
ADD CONSTRAINT restricted_keys
CHECK (
  -- Check that 'feature_value' contains all specified keys
  feature_value::hstore ?& ARRAY['size', 'format', 'quality']
  AND
  -- and that number of keys is three
  array_length(akeys(feature_value), 1) = 3
);

这将确保feature_value中的每个数据都包含三个密钥:大小,格式和质量;并且不允许空数据。

注意,在应用此查询之前,您需要从表中删除所有无效数据,否则您将收到错误:

ERROR: check constraint "restricted_keys" is violated by some row

您可以在数据库控制台中执行此查询,或者由于您使用的是Django,因此更适合创建迁移并使用RunSQL应用此查询:创建一个emtpy迁移并将上述查询传递给{ {1}},并将此查询传递到migrations.RunSQL param,以便在未应用迁移时删除约束:

reverse_sql

申请后:

ALTER TABLE your_feature_table
DROP CONSTRAINT restricted_keys;