Подтвердить что ты не робот

Rails db: structure: дамп имеет неправильные пути поиска

Я использую db/structure.sql для сохранения нашего состояния БД, поскольку у нас есть расширения PostGIS и встроенные функции, которые делают использование schema.rb нецелесообразным.

При запуске db:structure:dump рельсы имеют нечетное поведение установки путей поиска в верхней части И в нижней части файла. Проблема здесь в том, что путь поиска вверху неверен, в результате чего 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.

Возможно ли, чтобы рельсы установили правильный путь поиска в верхней части файла?

4b9b3361

Ответ 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 в базе данных, где вы делаете дамп (вы можете сделать это командой \dx в консоли psql) - может быть причиной проблемы.

Ситуация может произойти после создания базы данных rake db:create без postgis_schema: postgis в database.yml. Подробнее об этом параметре можно узнать в файле activerecord-postgis-adapter .