在Postgres 9.3+中将JSON转换为HSTORE?

max*_*axm 5 postgresql json database-migration hstore

我已经阅读了文档,似乎没有可识别的方法来执行ALTER TABLE ... ALTER COLUMN ... USING语句直接将json类型列转换为hstore类型.没有可用的功能(我知道)来执行演员表.

我的下一个最佳选择是创建一个新类型的hstore列,使用一些外部工具将我的JSON数据复制到该新列,删除旧json列并将新hstore列重命名为旧列的名称.

有没有更好的办法?

到目前为止我所拥有的是:

$ CREATE TABLE blah (unstructured_data JSON);

$ ALTER TABLE blah ALTER COLUMN unstructured_data 
       TYPE hstore USING CAST(unstructured_data AS hstore);
Run Code Online (Sandbox Code Playgroud)
ERROR:   cannot cast type json to hstore
Run Code Online (Sandbox Code Playgroud)

poz*_*ozs 10

不幸的是,PostgreSQL不允许在USING子句中使用所有类型的表达式ALTER TABLE ... SET DATA TYPE ...(f.ex.子查询是不允许的).

但是,您可以编写一个函数来克服这个问题,您只需要决定如何处理高级类型(在对象的值中),如数组和对象.这是一个示例,它只是将它们转换为字符串:

CREATE OR REPLACE FUNCTION my_json_to_hstore(json)
  RETURNS hstore
  IMMUTABLE
  STRICT
  LANGUAGE sql
AS $func$
  SELECT hstore(array_agg(key), array_agg(value))
  FROM   json_each_text($1)
$func$;
Run Code Online (Sandbox Code Playgroud)

之后,您可以在您的使用中使用此功能ALTER TABLE,例如:

ALTER TABLE blah
  ALTER COLUMN unstructured_data
  SET DATA TYPE hstore USING my_json_to_hstore(unstructured_data);
Run Code Online (Sandbox Code Playgroud)