Rails db:structure:dump有不正确的搜索路径

时间:2016-01-11 21:59:50

标签: ruby-on-rails postgresql schema postgis

我正在使用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"

分贝/ 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将正确的搜索路径放在文件的顶部?

1 个答案:

答案 0 :(得分: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扩展名存在于公共方案中时,structure.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命令进行) - 可能是问题的原因。

在database.yml中rake db:create创建数据库而没有postgis_schema: postgis后,可能会发生这样的情况。您可以在activerecord-postgis-adapter documentation中阅读有关此选项的详细信息。