簡體   English   中英

在Postgresql中限制數據庫

[英]Restricting database in Postgresql

我將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允許的鍵為大小格式質量。 我可以在使用Django-Admin更新數據庫時執行此操作。 但是我不能使用具有相同限制的pgAdmin3直接更新數據庫,即我想對數據庫級別施加相同的限制。 我怎樣才能做到這一點? 有什么建議么?

您需要更改 Future表並使用以下查詢為feature_value字段添加約束

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應用此查詢:創建一個空遷移並將上述查詢傳遞給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...).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM