【问题标题】:Restricting database in Postgresql在 Postgresql 中限制数据库
【发布时间】:2016-05-31 20:09:18
【问题描述】:

我将 Django1.9 与 Postgresql 一起使用。这是我的模型“特征”的数据模型:

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 允许的键是 sizeformatquality。 我可以在使用 Django-Admin 更新数据库时执行此操作。但是我无法使用具有相同限制的 pgAdmin3 直接更新数据库,即我想对数据库级别施加相同的限制。我怎样才能做到这一点?有什么建议吗?

【问题讨论】:

    标签: django database postgresql pgadmin hstore


    【解决方案1】:

    你需要ALTERFuture表并为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
    

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

    ALTER TABLE your_feature_table
    DROP CONSTRAINT restricted_keys;
    

    申请后:

    sql> INSERT INTO your_feature_table (feature_value) VALUES ('size => 124, quality => great, format => A4')
    1 row affected in 18ms
    
    sql> INSERT INTO your_feature_table (feature_value) VALUES ('format => A4')
    ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys"
    Detail: Failing row contains ("format"=>"A4").
    
    sql> INSERT INTO your_feature_table (feature_value) VALUES ('')
    ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys"
    Detail: Failing row contains ().
    
    sql> INSERT INTO your_feature_table (feature_value) VALUES ('a => 124, b => great, c => A4')
    ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys"
    Detail: Failing row contains ("a"=>"124", "b"=>"great", "c"=>"A4").
    
    sql> INSERT INTO your_feature_table (feature_value) VALUES ('size => 124, quality => great, format => A4, incorrect_key => error')
    ERROR: new row for relation "your_feature_table" violates check constraint "restricted_keys"
    Detail: Failing row contains ("size"=>"124", "format"=>"A4", "quality"=>"great", "incorrect_ke...).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-16
      • 2016-09-03
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多