【发布时间】:2016-04-16 09:00:56
【问题描述】:
我使用db/structure.sql 来保存我们的数据库状态,因为我们有PostGIS 扩展和内置函数,使得使用schema.rb 不切实际。
在运行db:structure:dump 时,rails 有一种奇怪的行为,即在文件顶部附近和底部附近设置搜索路径。这里的问题是顶部的搜索路径不正确,导致db:schema:load惨败。
我目前正在手动编辑它(即将postgis 添加到顶部搜索路径),但如果我能以某种方式通过转储任务正确设置搜索路径,那就太好了。
database.yml
development: &dev
adapter: postgis
database: myapp_dev
host: localhost
encoding: utf8
template: template0 # Required for UTF8 encoding
postgis_extension: true
schema_search_path: "public,postgis"
db/structure.sql
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET search_path = public, pg_catalog;
... Table / Sequence / Index creation happens here ...
--
-- PostgreSQL database dump complete
--
SET search_path TO public,postgis;
... Migrations inserted here ...
这里的问题是,要创建的表在搜索路径中需要postgis(毕竟它们确实使用postgis数据类型)
我认为第二个搜索路径集是 database.yml 中设置的搜索路径的结果。
是否可以让 rails 将正确的搜索路径放在文件顶部?
【问题讨论】:
-
你能在数据库配置而不是 Rails 配置中设置搜索路径吗?
-
我可以 (ALTER DATABASE db SET search_path=public,postgis;) 但是 structure.sql 的重点是允许新部署有一个没有手动 sql 命令的工作环境(否则我可以只使用pg_dump 和 pg_restore)。
-
AFAIK
structure.sql是通过 PostgreSQL CLI 工具生成的,除了指定基本连接参数之外,不涉及 Rails 配置。无论如何,如果你做一个 ALTER DATABASE,那应该会显示在structure.sql中,不是吗? -
不,即使在 ALTER DATABASE 之后,struct.sql 最后也只有 postgis 搜索路径 - 这很烦人,因为每次我运行迁移时,我都必须手动将其重新添加到文件中,以便我的规格通过了。
标签: ruby-on-rails postgresql schema postgis