2013-03-01 77 views
0

我正在部署使用PostgreSQL和HSTORE的Rails应用程序。我需要rubber使用橡皮部署时启用hstore

一切正常,除非HSTORE未正确启用。当包含execute("CREATE EXTENSION hstore")运行迁移,我收到以下错误:

** [out :: production.---] 
** [out :: production.---] -- execute("CREATE EXTENSION hstore") 
** [out :: production.---] 
** [out :: production.---] rake aborted! 
** [out :: production.---] An error has occurred, this and all later migrations canceled: 
** [out :: production.---] 
** [out :: production.---] PG::Error: ERROR: permission denied to create extension "hstore" 
** [out :: production.---] HINT: Must be superuser to create this extension. 

创建Postgres的实例的脚本有这样的代码:

create_user_cmd = "CREATE USER #{env.db_user} WITH NOSUPERUSER CREATEDB NOCREATEROLE" 

,所以我觉得这个问题可能涉及到NOSUPERUSER属性在这里设置。

有没有什么办法可以在使大部分生成的文件保持不变的情况下启用使用橡胶的hstore?

+0

你试过了gem'activerecord-postgres-hstore'吗?它通过迁移来安装hstore的功能。 – 2013-03-01 18:34:19

+0

问题在于运行迁移时的权限。我安装了宝石。 – pgb 2013-03-01 18:57:09

回答

5

问题是橡胶创建DB用户为NOSUPERUSER。我的解决方法是创建在Capistrano的deploy:migrate之前和之后运行的任务,这些任务会将用户更改为SUPERUSER并返回。

下面的代码:

namespace :rubber do 

    namespace :project do 

    before "deploy:migrate", "rubber:project:add_pg_superuser_and_enable_hstore" 
    after "deploy:migrate", "rubber:project:remove_pg_superuser" 

    task :add_pg_superuser_and_enable_hstore, 
     :roles => [:postgresql_master, :postgresql_slave] do 
     alter_user_cmd = "ALTER USER #{rubber_env.db_user} SUPERUSER" 
     create_hstore_cmd = "CREATE EXTENSION IF NOT EXISTS hstore;" 
     rubber.sudo_script "add_superuser_create_hstore", <<-ENDSCRIPT 
     sudo -i -u postgres psql -c "#{alter_user_cmd}" 
     sudo -i -u postgres psql -c "#{create_hstore_cmd}" 
     ENDSCRIPT 
    end 

    task :remove_pg_superuser, :roles => [:postgresql_master, 
              :postgresql_slave] do 
     alter_user_cmd = "ALTER USER #{rubber_env.db_user} NOSUPERUSER" 
     rubber.sudo_script "add_superuser_create_hstore", <<-ENDSCRIPT 
     sudo -i -u postgres psql -c "#{alter_user_cmd}" 
     ENDSCRIPT 
    end 

    end 

end 
+0

这应该是被接受的答案。我将它添加到我的config/deploy.rb的底部,并且我已备份并运行。谢谢! – eddieroger 2014-07-10 02:47:48

+0

我不认为我们应该推荐人们启用超级用户作为一般用途的答案。橡胶生成可自由修改的文件。您应该修改生成的deploy-postgresql.rb以创建扩展以及正在执行的其他特权SQL。 – nirvdrum 2016-01-21 14:10:32

0

另一种选择是没有Postgres的部署时,超级用户参与,但创建一个模板(或使用默认的一个),并安装模板上的延伸。然后当你创建一个数据库时,它将会安装扩展。

好答案here和​​。