【问题标题】:How to install Postgres extensions at database creation?如何在创建数据库时安装 Postgres 扩展?
【发布时间】:2013-05-17 14:13:15
【问题描述】:

如果 rake 命令db:create 后面可以跟一个 postgresql 安装脚本,那就太好了。例如,这个。 (必须以 postgres 用户身份运行):

CREATE EXTENSION "fuzzystrmatch";

这是因为,在这一刻,我每次创建数据库时都是手动进行的。

有什么提示吗?

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    从 Rails 4 开始,有一个 enable_extension 方法:

    class AddFuzzyStringMatching < ActiveRecord::Migration
      def change
        enable_extension "fuzzystrmatch"
      end
    end
    

    【讨论】:

      【解决方案2】:

      我只是在迁移中这样做

      class AddCryptoToDb < ActiveRecord::Migration
        def up
          execute <<-SQL
            CREATE extension IF NOT EXISTS pgcrypto;
          SQL
        end
      end
      

      你可以在那里执行任何 sql。我也是为函数做的

      class BuildFnSetWebUsersUid < ActiveRecord::Migration
        def up
          say "building fn_set_web_users_uid function"
          execute <<-SQL
            CREATE OR REPLACE FUNCTION fn_set_web_users_uid()
              RETURNS trigger AS
            $BODY$
              BEGIN
                IF NEW.uid IS NULL THEN
                  SELECT UID into NEW.uid
                  FROM generate_series(10000, (SELECT last_value FROM web_users_uid_seq)) AS s(uid)
                  EXCEPT
                  SELECT uid FROM web_users
                  ORDER BY uid;
                  IF NEW.uid is NULL THEN
                    SELECT nextval('web_users_uid_seq') INTO NEW.uid;
                   END IF;
                END IF;
                RETURN NEW;
              END;
            $BODY$
              LANGUAGE 'plpgsql';
        SQL
        end
      
        def down
          execute "DROP FUNCTION IF EXISTS fn_set_web_users_uid;"
        end
      end
      

      此外,它不需要是 postgres 用户,这取决于它需要是超级用户或数据库所有者的扩展。因此,在我的开发盒中,我为用户提供了超级用户权限以方便使用。

      【讨论】:

        【解决方案3】:

        您可以创建一个 rake 任务(这很简单),或者弄乱 template1 数据库(不推荐,但可能):

        http://www.postgresql.org/docs/9.2/static/manage-ag-templatedbs.html

        【讨论】:

          猜你喜欢
          • 2020-08-27
          • 2012-07-20
          • 2017-01-20
          • 2020-02-28
          • 2019-12-31
          • 1970-01-01
          • 2017-04-04
          • 2017-06-27
          • 1970-01-01
          相关资源
          最近更新 更多