ruby 如何在Heroku上为PostgreSQL添加intarray扩展

4nkexdtk  于 2023-05-17  发布在  Ruby
关注(0)|答案(4)|浏览(66)

我的应用程序使用了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函数)。
谢谢

jtw3ybtb

jtw3ybtb1#

我从Postgres社区得到的普遍共识是,intarray通过使用int[]而过时,并且它只是为了向后兼容非常旧的应用程序而保留。这就是为什么我们没有添加对它的支持。
到目前为止,每个要求它的人实际上都对int[]更满意,只是还没有找到它。有没有一些用例,你实际上需要一个intarray列?我们可以打开它。

5m1hhzi4

5m1hhzi42#

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

xvw2m8pv

xvw2m8pv3#

我必须回答我自己的问题,只是为了提供更多的细节。
intarray用于从包含123/312/56/9863等字符串的列中提取路径信息。这是存储(差)作为字符串,而不是一个数组放在首位。
我们需要intarray的原因是因为我们有idx函数。
当时的情况是这样的:

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

所有这些都是临时措施。但是由于heroku不能支持idx,使用它的唯一方法是添加一个custom function。但是我们将查询和数据结构转换为使用ltree及其index函数。
除了不需要依赖idx(但引入了另一个依赖ltree)之外,我们还将查询的性能提高了x200倍。

biswetbf

biswetbf4#

注意:Heroku似乎在某个时候停止允许intarray安装在public模式中,而是要求它安装在heroku_ext模式中。这意味着,如果您从一个Heroku示例pull一个数据库,该示例在更改之前已经在public上安装了intarray,那么当您将它push到一个新示例时,它将无法正常工作。
您需要更改schema / dump以将扩展放在heroku_ext中(或者在pull执行它之前更改它在源示例中安装的schema)。

相关问题