我使用apartment
gem作为我的SaaS(使用Ruby on Rails构建),其中一个要求是我们需要通过专用架构安装hstore
PostgreSQL扩展(即:shared_extensions
),而不是默认的public
架构。
Heroku默认启用hstore
;但它安装在public
架构中。我试图做的时候:
ActiveRecord::Base.connection.execute("ALTER EXTENSION hstore SET SCHEMA hstore;")
控制台返回:
(3.6ms) ALTER EXTENSION hstore SET SCHEMA hstore;
PG::Error: ERROR: must be owner of extension hstore
目前在代码方面无法在hstore
上安装public
扩展名,因此我必须找到一种方法将hstore
扩展名设置为shared_extensions
架构。
Heroku上有没有办法做到这一点?感谢。
答案 0 :(得分:1)
原来我无法在Heroku上做ALTER EXTENSION hstore SET SCHEMA hstore;
。我已经记录了解决方法here
?schema_search_path=public,hstore
附加到您的DATABASE_URL
环境变量中,由此您不必修改database.yml
文件(这是不可能的,因为Heroku会重新生成一个完全不同且不可变的{每个部署都有自己的{1}} database.yml
heroku pg:psql
(注意:这将删除所有使用DROP EXTENSION hstore;
类型的列,因此请谨慎使用;仅对新的PostgreSQL实例执行此操作)hstore
CREATE SCHEMA IF NOT EXISTS hstore;
然后按Enter(CREATE EXTENSION IF NOT EXISTS hstore SCHEMA hstore;
退出)答案 1 :(得分:1)
一种破坏性较小的替代工作:
1.。)将您的应用程序置于维护模式:
heroku maintenance:on -a [app-name]
2.)备份你的数据库:总是备份:)
heroku pg:backups capture -a [app-name]
3.)在本地复制数据库:
heroku pg:pull [Database URL] mylocaldb -a [app-name]
4.)现在你有本地数据库,你可以移动扩展而不会破坏任何数据或列,因为你有本地超级用户priv:
ALTER EXTENSION "hstore" SET SCHEMA hstore;
5.)现在将此版本导出回生产:
heroku pg:push mylocaldb [Database URL] -a [app-name]
6.)将您的应用程序从maint中取出。模式,您现在已在hstore的共享模式中安装了扩展。
7.如果你在轨道上,你仍然需要执行Tu H.的回复的第1步。 4.1
或者如果你运行的是rails 4.1+,你可以只更新你的database.yml文件:
schema_search_path: "public,hstore"
这是一种破坏性较小的方法,可以在没有太多停机时间的情况下完成您想要的工作。