如何使用Heroku的Postgres DB进行ALTER EXTENSION?

时间:2014-07-11 11:34:30

标签: ruby-on-rails postgresql heroku schema hstore

我使用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上有没有办法做到这一点?感谢。

2 个答案:

答案 0 :(得分:1)

原来我无法在Heroku上做ALTER EXTENSION hstore SET SCHEMA hstore;。我已经记录了解决方法here

  1. ?schema_search_path=public,hstore附加到您的DATABASE_URL环境变量中,由此您不必修改database.yml文件(这是不可能的,因为Heroku会重新生成一个完全不同且不可变的{每个部署都有自己的{1}}
  2. 从命令行运行database.yml
  3. 然后heroku pg:psql注意:这将删除所有使用DROP EXTENSION hstore;类型的列,因此请谨慎使用;仅对新的PostgreSQL实例执行此操作)
  4. 下一页:hstore
  5. 最后: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"

这是一种破坏性较小的方法,可以在没有太多停机时间的情况下完成您想要的工作。