【问题标题】:Postgresql extensions removed on db/structure.sql when migrations runs迁移运行时删除 db/structure.sql 上的 Postgresql 扩展
【发布时间】:2017-12-13 10:20:19
【问题描述】:

我有一个使用 postgresql + 一些扩展的 Rails 应用程序,但每次我运行 rails db:migrate 时,它都会删除启用扩展的行。我每次都要手动复制粘贴。

正在删除 db/structure.sql 上的行:

-- Name: EXTENSION "postgis"; Type: COMMENT; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "postgis" WITH SCHEMA public;


--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;


--
-- Name: EXTENSION pg_trgm; Type: COMMENT; Schema: -; Owner: -
--

COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching based on trigrams';


--
-- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;


--
-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: -
--

COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';

我的数据库.yml:

default: &default
  adapter: postgis
  encoding: unicode
  host: <%= ENV.fetch('DB_HOST', 'localhost') %>
  username: <%= ENV.fetch('DB_USERNAME') %>
  password: <%= ENV.fetch('DB_PASSWORD') %>
  schema_search_path: public

test:
  <<: *default
  database: db_test

development:
  <<: *default
  database: db_development

production:
  <<: *default
  database: db_production

有什么办法可以解决吗?

我正在使用以下版本:

postgresql:9.6

postgis:2.3

导轨:5.0

macOS:10.12

更新:

我设法找到了解决该问题的方法。由于我使用schema_search_path 作为公共,如果未定义默认选项是公共的。刚刚从 database.yml 中删除了这一行,它现在可以工作了。在明确定义 schema_search_path 时仍然不知道为什么会发生这种情况。

【问题讨论】:

    标签: ruby-on-rails postgresql postgis database-migration


    【解决方案1】:

    您可以生成迁移并使用enable_extension 方法:

    class AddExtensions < ActiveRecord::Migration[5.1]
       def change
         enable_extension "postgis"
         enable_extension "plpgsql"
         enable_extension "pg_trgm"
         enable_extension "uuid-ossp"
         # ...
       end
    end
    

    【讨论】:

    • 已经这样做了。我设法解决了这个问题,请参阅我的更新说明。还是谢谢。
    【解决方案2】:

    我遇到了类似的问题,database.ymlschema_search_path: public, third_party 指定了多个架构。我找到了为什么CREATE EXTENSION 语句没有以structure.sql 结尾的答案。

    原因在https://github.com/rails/rails/issues/17157中有解释,但这里供参考

    如果用户指定了 schema_search_path 并且还具有 扩展,由 rake 生成的 pg_dump 调用 db:structure:dump 包含 --schema 标志,这意味着没有 CREATE EXTENSION 语句将在结果中创建 结构.sql。根据 pg_dump 文档:

    【讨论】:

      【解决方案3】:

      在挖掘了架构转储器的代码后,我发现了一个似乎有帮助的选项。

      ActiveRecord::Base.dump_schemas = :all

      我将此添加到 config/initializers/schema_dumper.rb

      【讨论】:

        【解决方案4】:

        您还可以将所有扩展移动到另一个架构,例如 shared_extension,并通过设置 config.active_record.dump_schemas = "public" 控制将转储哪些数据库架构。

        【讨论】:

          猜你喜欢
          • 2020-09-11
          • 1970-01-01
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 2015-01-15
          • 2022-07-06
          • 2016-04-08
          • 1970-01-01
          相关资源
          最近更新 更多