我使用的是Rails 4.2.7。我想创建一个启用扩展的迁移,但前提是我运行的主机环境中不存在该扩展。我已经创建了
class EnableUuidOsspExtension < ActiveRecord::Migration
def change
enable_extension 'uuid-ossp'
end
end
但是如果已经启用了这个扩展,我想禁止启用它。我如何调整上述迁移来实现这一点?这样做的动机是因为在我的本地机器上,我必须运行这个来将它添加到PostGres,但是如果我迁移到Heroku,这个扩展可能已经到位了,但是我不希望在运行db迁移脚本时出现崩溃。
3条答案
按热度按时间qhhrdooz1#
有一个
extensions
方法返回一个扩展名数组,所以你可以这样做:你也可以在SQL中手工完成,你可以访问
create extension if not exists
:8oomwypt2#
根据Postgres文档,您可以显式地标记
IF NOT EXISTS
(https://www.postgresql.org/docs/current/static/sql-createextension.html)这也在
enable_extension
的PostgreSQL适配器中使用(https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L332)此外,如果它不会被使用,Postgres不会重新创建或做一些魔术,如果扩展已经安装。它只会抛出错误-在这种情况下,通常你的迁移不应该崩溃和烧伤:)
zte4gxcn3#
在new rails中,您不需要显式地指定它
就用这样的语法
生成SQL查询
回滚时