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

标签 json postgresql 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);
ERROR:   cannot cast type json to hstore

最佳答案

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

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

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$;

之后,您可以在ALTER TABLE 中使用它,例如:

ALTER TABLE blah
  ALTER COLUMN unstructured_data
  SET DATA TYPE hstore USING my_json_to_hstore(unstructured_data);

关于json - 在 Postgres 9.3+ 中将 JSON 转换为 HSTORE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28315948/

相关文章:

python - Django不一致迁移历史: Migration X is applied before its dependency Y on database 'default'

php - json_decode 函数 php ://input return Invalid JSON Format

javascript - 使用 JSONP 访问维基百科 API

javascript - JSON层次结构,如何获取元素?

sql - 将字符串匹配到 Postgres 数据库列中的字符串数组

php - 集成测试 PHPUnit 和 Phinx

sql - Golang 服务器 : send JSON with SQL query result that has variable number of columns

javascript - 使用 bcrypt 获取有效密码

database - 在 Excel 中使用 power query 连接到 Postgresql 数据库

python - 如何使用 alembic --autogenerate 忽略某些模式