当运行迁移时,db/structure.sql中删除了Postgresql扩展。

4

我有一个使用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)';

我的database.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
rails:5.0
macOS:10.12
更新:
我设法找到了一个解决方法。由于我将schema_search_path设置为public,如果没有定义,则默认选项是public。只需从database.yml中删除此行即可正常工作。仍然不清楚为什么在明确定义schema_search_path时会出现这种情况。
4个回答

3
您可以生成迁移并使用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

已经在做了。我设法解决了这个问题,请看我的更新说明。无论如何还是谢谢。 - hlmerscher

2
我遇到了类似的问题,其中database.yml指定了多个模式,例如schema_search_path: public, third_party。我找到了为什么CREATE EXTENSION语句没有出现在structure.sql中的答案。
原因在于https://github.com/rails/rails/issues/17157中有解释,以下是参考内容:
如果用户指定了schema_search_path并且还有扩展,那么由rake db:structure:dump生成的pg_dump调用将包括--schema标志,这意味着在生成的structure.sql中不会创建任何CREATE EXTENSION语句。根据pg_dump文档的说法:

1

在查看模式转储代码后,我发现有一个选项似乎很有用。

ActiveRecord::Base.dump_schemas = :all

我将其添加到了 config/initializers/schema_dumper.rb 中。


0

您也可以将所有扩展移动到另一个模式,例如shared_extension,并通过设置config.active_record.dump_schemas = "public"来控制要转储的数据库模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接