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)。 AFAIK structure.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 4 的 Rails_admin 批量分配错误

难以安装和运行rails(/ usr / local / bin / rails:没有这样的文件或目录),曾经恢复到早期的rails版本

Rails:在 Rails 6 中使用绝对路径

Rails:Rails 5 中不允许的参数