Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用postgresql在django hstorefield中存储唯一值_Django_Postgresql - Fatal编程技术网

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

使用postgresql在django hstorefield中存储唯一值,django,postgresql,Django,Postgresql,是否可以将postgresql hstorefield(django>=1.8)添加到hstore中的值唯一的模型中? 键显然是唯一的,但值也可以是唯一的吗?我想可以将自定义验证器添加到模型中,但我想知道这是否可以在数据库级别上完成单个hstore值可以包含多个键=>值对,这使得基于唯一索引的解决方案不可能实现。此外,新的hstore值也可以有多个key=>value对。唯一可行的替代方法是在表上插入或更新之前使用: CREATE FUNCTION trf_uniq_hstore_values(

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

单个
hstore
值可以包含多个
键=>值
对,这使得基于唯一索引的解决方案不可能实现。此外,新的
hstore
值也可以有多个
key=>value
对。唯一可行的替代方法是在表上插入或更新之前使用

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();

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

我现在明白了为什么这是不可能的,因为在关系模型中,键值对没有相同的权限是常规字段。提供的解决方案很好,但我更愿意使用ORM在Python中进行验证,因为编写/维护这样的代码对我来说更容易,即使从性能角度看,在DB级别上做更好。谢谢您如果您还添加了一个
检查
约束以防止在单个
hs存储
字段中出现该键的多个实例,则可以使用
唯一
表达式索引。为此,请定义“唯一”。这组值是唯一的吗?键/值组合集是否唯一?某个特定键的值是否唯一?请举例说明哪些是应该允许的,哪些是不应该允许的。编辑问题,完成后在此处发表评论。