我正在使用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将正确的搜索路径放在文件的顶部?
答案 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中阅读有关此选项的详细信息。