我有一个使用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
时会发生这种情况。
答案 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.yml
为schema_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文档: