Postgres:如何处理已弃用的hstore运算符:“=>”

时间:2013-11-25 15:55:01

标签: r postgresql hstore

我刚刚读过hstore扩展名is deprecated and might be removed in future versions=>运算符。这是个坏消息,因为我在R中有几个函数 当存储到包含hstore字段的Postgres表时,依赖于使用此运算符。

在写入数据库之前,我在内存中准备了data.framedata.table(R Session)。 随后我只使用方便的函数dbWriteTable将整个表在内存中写入数据库。因此,使用postgres函数hstore(文本,文本)会很不方便。

处理此类公告的好策略是什么?我很惊讶他们正在移除运营商,因为必须有很多人在其他类型的字段旁边写入hstore。这也不是特定于R的。对于许多语言来说,它必须是同一个问题。

虽然到目前为止我得到了一些有用的见解,但这可能有助于澄清我的问题:

我为R人员添加了一个可重现的示例,并为世界其他地方添加了屏幕截图.. enter image description here 我在R中构建了一个data.frame(基本上是内存中的表表示),如下所示:

mydf <- structure(list(ts_key = c("somekey", 
                      "somekey"), ts_language = c("de", "en"
                      ), ts_labels = c("\"Kurztitel\" => \"Wohlbefinden\",\"mögliche_Antworten\" => \"fantastisch,so lala,total fertig\",\"Wortlaut\" => \"Wie geht es?\"", 
                                       "\"available_items\" => \"awesome,somewhat ok,wasted\",\"short_title\" => \"well being\",\"wording\" => \"How are you?\""
                      )), .Names = c("ts_key", "ts_language", "ts_labels"), row.names = c(NA, 
                                                                                          -2L), class = "data.frame")

因此内存表/ data.frame包含hstore作为其列之一的字符。 这非常方便,因为我可以拥有一个包含大量行的data.frame,然后只使用:

dbWriteTable(myconnection,"somePostgresTableWithTheRightStructure",mydf,append=T)

只需将整个data.frame写入数据库,而无需构建查询或显式循环。我想保留这个,但我不知道告诉dbWriteTable如何使用hstore(文本,文本)。

2 个答案:

答案 0 :(得分:3)

仅删除运算符,而不删除基础功能。而不是

a => b

hstore(a, b)

这完全向后兼容。所以今天就改变你的代码并完成。

答案 1 :(得分:2)

它实际上并不特定于hstore:它也会影响其他自定义运算符。其removal in 9.2的推理是the SQL standard now reserves that token

  

处理此类公告的好策略是什么?

考虑切换到使用json。它有一个类似的->运算符,一组类似的函数,我想你有R库允许从一个对象转到json并返回。在数据库级别,更改仅涉及cast from hstore to json(请参阅json docs页面上的最后一个注释)。