我的应用程序使用了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
函数)。
谢谢
4条答案
按热度按时间jtw3ybtb1#
我从Postgres社区得到的普遍共识是,
intarray
通过使用int[]
而过时,并且它只是为了向后兼容非常旧的应用程序而保留。这就是为什么我们没有添加对它的支持。到目前为止,每个要求它的人实际上都对
int[]
更满意,只是还没有找到它。有没有一些用例,你实际上需要一个intarray
列?我们可以打开它。5m1hhzi42#
intarray
已在Heroku since March 2014上列入白名单,因此您应该能够直接启用扩展。如果在此之前配置了数据库,则首先需要upgrade your database。xvw2m8pv3#
我必须回答我自己的问题,只是为了提供更多的细节。
intarray
用于从包含123/312/56/9863
等字符串的列中提取路径信息。这是存储(差)作为字符串,而不是一个数组放在首位。我们需要
intarray
的原因是因为我们有idx
函数。当时的情况是这样的:
idx
查找给定的数字所有这些都是临时措施。但是由于heroku不能支持
idx
,使用它的唯一方法是添加一个custom function。但是我们将查询和数据结构转换为使用ltree
及其index
函数。除了不需要依赖
idx
(但引入了另一个依赖ltree
)之外,我们还将查询的性能提高了x200倍。biswetbf4#
注意:Heroku似乎在某个时候停止允许
intarray
安装在public
模式中,而是要求它安装在heroku_ext
模式中。这意味着,如果您从一个Heroku示例pull
一个数据库,该示例在更改之前已经在public
上安装了intarray
,那么当您将它push
到一个新示例时,它将无法正常工作。您需要更改schema / dump以将扩展放在
heroku_ext
中(或者在pull
执行它之前更改它在源示例中安装的schema)。