迁移运行时,db / structure.sql上的Postgresql扩展已删除

时间:2017-12-13 10:20:20

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

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

在db / structure.sql上删除行:

'<option value="'.$symbol.'">'.$name.'</option>';

我的database.yml:

rails db:migrate

任何想法我该如何解决?

我使用以下版本:

postgresql:9.6

postgis:2.3

rails:5.0

macOS:10.12

更新

我设法找到问题的解决方法。因为我使用-- 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)'; 作为公共,如果没有定义,默认选项是public。刚刚从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 时会发生这种情况。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在浏览了模式转储器的代码后,我发现了一个似乎有帮助的选项。

ActiveRecord::Base.dump_schemas = :all

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

答案 2 :(得分:0)

您还可以将所有扩展程序移动到另一个模式,如shared_extension,并控制将按集config.active_record.dump_schemas = "public"转储哪些数据库模式。

答案 3 :(得分:0)

我遇到了类似的问题,其中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语句   structure.sql。根据pg_dump文档: