29

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

CREATE EXTENSION "fuzzystrmatch";

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

有什么提示吗?

4

3 回答 3

73

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

class AddFuzzyStringMatching < ActiveRecord::Migration
  def change
    enable_extension "fuzzystrmatch"
  end
end
于 2013-08-07T18:58:41.097 回答
6

我只是在迁移中这样做

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 用户,具体取决于它需要是超级用户或数据库所有者的扩展名。因此,在我的开发箱中,我为用户提供了超级用户权限,以便于使用。

于 2013-05-17T14:44:05.137 回答
1

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

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

于 2013-05-17T14:27:46.043 回答