错误:扩展“btree_gist”必须安装在架构“heroku_ext”中

2023-12-31

Heroku 对 postgresql 的方式做了改变扩展已安装 https://devcenter.heroku.com/articles/heroku-postgres-extensions-postgis-full-text-search#installing-extensions

这会搞砸 Heroku 中的新 Rails 审查应用程序,并出现以下错误。

错误:扩展“btree_gist”必须安装在架构“heroku_ext”中

这把事情搞砸了,因为我需要删除现有的扩展并使用 heroku_ext 模式重新启用。我在运行迁移之前使用 bin/rails db:struct:load 。

此外,随着 Heroku 在审核应用程序中添加架构,Structure.sql 也会出现分歧,我们需要在本地开发计算机中手动运行创建。

有人遇到过这个问题吗?


我开发了一个猴子补丁解决方案,这绝对是一个黑客,但比预约会迁移或从 schema.rb 中删除行更好。

把这个放进去config/initializers。我打电话给我的_enable_extension_hack.rb以确保它尽早加载。

module EnableExtensionHerokuMonkeypatch
  # Earl was here
  def self.apply_patch!
    adapter_const = begin
      Kernel.const_get('ActiveRecord::ConnectionAdapters::PostgreSQLAdapter')
    rescue NameError => ne
      puts "#{self.name} -- #{ne}"
    end

    if adapter_const
      patched_method = adapter_const.instance_method(:enable_extension)

      # Only patch this method if it's method signature matches what we're expecting
      if 1 == patched_method&.arity
        adapter_const.prepend InstanceMethods
      end
    end
  end

  module InstanceMethods
    def enable_extension(name)
      name_override = name

      if schema_exists?('heroku_ext')
        puts "enable_extension -- Adding SCHEMA heroku_ext"
        name_override = "#{name}\" SCHEMA heroku_ext -- Ignore trailing double quote"
      end

      super name_override
    end
  end
end

EnableExtensionHerokuMonkeypatch.apply_patch!

它有什么作用?它猴子修补enable_extension导致问题的调用db/schema.rb。具体来说,如果发现有一个名为"heroku_ext", 它会decorate给定的参数enable_extension这样执行的 SQL 就指定了"heroku_ext"架构。像这样:

CREATE EXTENSION IF NOT EXISTS "pg_stat_statements" SCHEMA heroku_ext -- Ignore trailing double quote"

如果没有这个 hack,生成的 SQL 看起来像这样:

CREATE EXTENSION IF NOT EXISTS "pg_stat_statements"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误:扩展“btree_gist”必须安装在架构“heroku_ext”中 的相关文章

随机推荐