使用postgresql在django hstorefield中存储唯一值

时间:2015-09-17 09:07:17

标签: django postgresql

是否可以将postgresql hstorefield(django> = 1.8)添加到模型中,其中hstore中的值是唯一的? 键显然是独一无二的,但值也可以是唯一的吗?我想自定义验证器可以添加到模型中,但我很想知道这是否可以在数据库级别完成

1 个答案:

答案 0 :(得分:1)

单个hstore值可以包含多个key => value对,从而无法根据唯一索引创建解决方案。此外,您的新hstore值也可以有多个key => value对。唯一可行的替代方案就是桌面上的BEFORE INSERT OR UPDATE触发器:

CREATE FUNCTION trf_uniq_hstore_values() RETURNS trigger AS $$
DECLARE
  dups text;
BEGIN
  SELECT string_agg(x, ',') INTO dups
  FROM (SELECT svals(hstorefield) AS x FROM my_table) sub
  JOIN (SELECT svals(NEW.hstorefield) AS x) vals USING (x);

  IF dups IS NOT NULL THEN
    RAISE NOTICE format('Value(s) %s violate(s) uniqueness constraint. Operation aborted.', dups);
    RETURN NULL;
  ELSE
    RETURN NEW;
  END IF;
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER tr_uniq_hstore_values
BEFORE INSERT OR UPDATE ON my_table
FOR EACH ROW EXECUTE PROCEDURE trf_uniq_hstore_values();

请注意,这不会捕获表中的现有重复项。