【发布时间】:2013-05-17 14:13:15
【问题描述】:
如果 rake 命令db:create 后面可以跟一个 postgresql 安装脚本,那就太好了。例如,这个。 (必须以 postgres 用户身份运行):
CREATE EXTENSION "fuzzystrmatch";
这是因为,在这一刻,我每次创建数据库时都是手动进行的。
有什么提示吗?
【问题讨论】:
如果 rake 命令db:create 后面可以跟一个 postgresql 安装脚本,那就太好了。例如,这个。 (必须以 postgres 用户身份运行):
CREATE EXTENSION "fuzzystrmatch";
这是因为,在这一刻,我每次创建数据库时都是手动进行的。
有什么提示吗?
【问题讨论】:
从 Rails 4 开始,有一个 enable_extension 方法:
class AddFuzzyStringMatching < ActiveRecord::Migration
def change
enable_extension "fuzzystrmatch"
end
end
【讨论】:
我只是在迁移中这样做
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 用户,这取决于它需要是超级用户或数据库所有者的扩展。因此,在我的开发盒中,我为用户提供了超级用户权限以方便使用。
【讨论】:
您可以创建一个 rake 任务(这很简单),或者弄乱 template1 数据库(不推荐,但可能):
http://www.postgresql.org/docs/9.2/static/manage-ag-templatedbs.html
【讨论】: