如何在Heroku上向PostgreSQL添加intarray扩展

时间:2013-02-01 01:01:08

标签: sql ruby postgresql heroku

我的应用程序正在使用PostgreSQL的intarray扩展名。

不幸的是,根据docs和命令行,它似乎不可用:

> echo 'show extwlist.extensions' | heroku pg:psql
                                                                                extwlist.extensions                                                                                 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 btree_gist,chkpass,cube,dblink,dict_int,dict_xsyn,earthdistance,fuzzystrmatch,hstore,isn,ltree,pg_trgm,pgcrypto,pgrowlocks,pgstattuple,plpgsql,unaccent,uuid-ossp,citext,tablefunc
(1 row)

此外:

> heroku pg:psql
psql (9.1.5, server 9.1.6)
SSL connection
Type "help" for help.

=> CREATE EXTENSION intarray;
WARNING:  extension "intarray" is not whitelisted
CREATE EXTENSION

这是否意味着我无法使用Heroku 或者有一种方法可以添加intarray扩展名(例如使用idx功能)。

感谢。

3 个答案:

答案 0 :(得分:5)

我得到的Postgres社区的普遍共识是,intarray仅仅使用int[]就已经过时了,并且它只是为了对非常旧的应用程序的向后兼容性而保留。这就是为什么我们没有增加对它的支持。

到目前为止,所有要求它的人实际上对int[]感到高兴并且没有找到它。是否有一些用例实际上需要intarray列?我们可以打开它。

答案 1 :(得分:4)

intarray已在Heroku since March 2014上列入白名单,因此您应该可以直接启用该扩展程序。如果您在此之前配置了数据库,则首先需要upgrade your database

答案 2 :(得分:2)

必须回答我自己的问题,只是为了提供更多细节。

intarray用于从包含123/312/56/9863等字符串的列中提取路径信息。首先将它(不良)存储为字符串而不是数组。

我们需要intarray的原因是因为我们拥有idx功能。

发生了什么事:

  • 将字符串转换为数组
  • 使用idx
  • 查找给定的号码
  • 按顺序返回下一个号码。

所有这些都是作为临时措施完成的。但由于heroku无法支持idx,因此使用它的唯一方法是添加custom function。 但我们将查询和数据结构转换为使用ltree及其index函数。

除了不需要依赖idx(但在ltree上引入另一个依赖项)之外,我们还将查询性能提高了x200倍。