Rails db:structure:dump 的搜索路径不正确
Posted
技术标签:
【中文标题】Rails db:structure:dump 的搜索路径不正确【英文标题】:Rails db:structure:dump has incorrect search paths 【发布时间】: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)。 AFAIKstructure.sql
是通过 PostgreSQL CLI 工具生成的,除了指定基本连接参数之外,不涉及 Rails 配置。无论如何,如果你做一个 ALTER DATABASE,那应该会显示在 structure.sql
中,不是吗?
不,即使在 ALTER DATABASE 之后,struct.sql 最后也只有 postgis 搜索路径 - 这很烦人,因为每次我运行迁移时,我都必须手动将其重新添加到文件中,以便我的规格通过了。
你可以研究github问题github.com/rgeo/activerecord-postgis-adapter/issues另见:gist.github.com/stestaub/6118568
【参考方案1】:
我已经制作了测试项目并重复了所描述的一系列操作 - 一切正常!我注意到规律性 - structure.sql 包含代码:
SET search_path = public, pg_catalog;
CREATE TABLE spatial_tests (
id integer NOT NULL,
latlon postgis.geography(Point,4326),
geo_col postgis.geometry(Geometry,4326)
);
注意列类型的postgis
前缀。只有当 postgis 扩展存在于 postgis 模式中时才会发生这样的代码:
postgis_test=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+---------------------------------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 2.1.7 | postgis | PostGIS geometry, geography, and raster spatial types and functions
(2 rows)
而且这段代码执行得很好。在另一种情况下,当 postgis 扩展存在于公共方案中时,struct.sql 看起来像这样:
SET search_path = public, pg_catalog;
CREATE TABLE spatial_tests (
id integer NOT NULL,
latlon geography(Point,4326),
geo_col geometry(Geometry,4326)
);
此处列名中没有前缀,此代码在执行时会产生错误。
Chris Noldus,请检查您进行转储的数据库中哪个方案包含 postgis 扩展(您可以通过 psql 控制台中的\dx
命令进行转储)- 可能是问题的原因。
这种情况可能发生在rake db:create
在 database.yml 中没有postgis_schema: postgis
创建数据库之后。您可以在 activerecord-postgis-adapter documentation 中阅读有关此选项的详细信息。
【讨论】:
感谢您的回答。我不再有这个问题了,我不确定是什么解决了这个问题 - 因为有人问我已经更新了库和数据库引擎,所以我认为其中一个更新解决了这个问题。以上是关于Rails db:structure:dump 的搜索路径不正确的主要内容,如果未能解决你的问题,请参考以下文章
markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails
如何在带有 Rails 4.2 的专用调试端口上使用工头启动 Rails?
难以安装和运行rails(/ usr / local / bin / rails:没有这样的文件或目录),曾经恢复到早期的rails版本