postgresql 如何仅在扩展尚不存在时才启用该扩展?

eyh26e7m  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(187)

我使用的是Rails 4.2.7。我想创建一个启用扩展的迁移,但前提是我运行的主机环境中不存在该扩展。我已经创建了

class EnableUuidOsspExtension < ActiveRecord::Migration
  def change
    enable_extension 'uuid-ossp'
  end
end

但是如果已经启用了这个扩展,我想禁止启用它。我如何调整上述迁移来实现这一点?这样做的动机是因为在我的本地机器上,我必须运行这个来将它添加到PostGres,但是如果我迁移到Heroku,这个扩展可能已经到位了,但是我不希望在运行db迁移脚本时出现崩溃。

qhhrdooz

qhhrdooz1#

有一个extensions方法返回一个扩展名数组,所以你可以这样做:

def up
  enable_extension('uuid-ossp') unless extensions.include?('uuid-ossp')
end

def down
  disable_extension('uuid-ossp') if extensions.include?('uuid-ossp')
end

你也可以在SQL中手工完成,你可以访问create extension if not exists

def up
  connection.execute('create extension if not exists "uuid-ossp"')
end
8oomwypt

8oomwypt2#

根据Postgres文档,您可以显式地标记IF NOT EXISTShttps://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)

def enable_extension(name)
    exec_query("CREATE EXTENSION IF NOT EXISTS \"#{name}\"").tap {
      reload_type_map
    }
  end

此外,如果它不会被使用,Postgres不会重新创建或做一些魔术,如果扩展已经安装。它只会抛出错误-在这种情况下,通常你的迁移不应该崩溃和烧伤:)

zte4gxcn

zte4gxcn3#

在new rails中,您不需要显式地指定它
就用这样的语法

def change
  enable_extension :pgcrypto
end

生成SQL查询

CREATE EXTENSION IF NOT EXISTS "pgcrypto";

回滚时

DROP EXTENSION IF EXISTS "pgcrypto" CASCADE;

相关问题