2012-08-30 132 views
12

我正在关注Daniel Azuma在geospatial analysis with rails上的演讲,但是我在第二个项目中运行rake db:migrate时遇到了困难。Rails + PostGIS错误迁移数据库

我的设置细节如下:我使用Postgres.app运行Postgresql,它给我Postgres 9.1.3版本和PostGIS 2.0.0。我遇到了一些与database.yml文件有关的问题,并且正在运行迁移。 (我已经加入了相关的宝石,并要求他们在application.rb中的信息)

我的database.yml文件看起来是这样的:

development: 
    adapter: postgis 
    postgis_extension: true 
    host: localhost 
    encoding: unicode 
    database: my_app_development 
    pool: 5 
    username: my_app 
    password: 

如果我添加以下行schema_search_path: "public,postgis"我得到:

rake aborted! 
PG::Error: ERROR: schema "postgis" does not exist 
: SET search_path TO public,postgis 

如果我删除了这一行,我收到以下错误,当我尝试迁移我的数据库:

rake aborted! 
PG::Error: ERROR: relation "geometry_columns" does not exist 
LINE 1: SELECT * FROM geometry_columns WHERE f_table_name='schema_mi...      ^
: SELECT * FROM geometry_columns WHERE f_table_name='schema_migrations' 

有没有人有如何解决这些问题的想法?

+0

有一个包含引用多边形作为数据类型的迁移。但是我不相信需要为几何列表创建额外的迁移我认为它应该引用postgis适配器 – tomciopp

+0

您是否得到了解决方案?我有同样的问题 – Martin

+0

请查看下面的解决方案。 – tomciopp

回答

9

这是我如何解决这个问题。我首先创建了一个新的迁移来添加postgis到数据库。 (我已经安装了的PostGIS和PostgreSQL通过在Mac自制。)

rails g migration add_postgis_to_database 

在迁移文件I除去改变方法和所使用的执行方法来添加POSTGIS。

execute("CREATE EXTENSION postgis;") 

之后,您可以检查数据库以确保postgis可用。

psql your_database_name 
SELECT PostGIS_full_version(); 
+0

谢谢它的作品! – joselo

+1

只是要清楚,迁移文件应该是这样的: 类AddPostgisToDatabase <的ActiveRecord ::迁移 执行(“创建扩展PostGIS的;”) 结束 – Will

+0

@will'轨摹migration'会给你一个模板将此代码添加到,以便将其放入'change'块或写入自己的'up'方法。 – tadman

2

您使用的是什么版本的PostgreSQL? EXTENSION东西appeared in 9.1。扩展是在一个包中加载多个对象的简便方法。

如果您使用的是不到9.1的版本,则可能会在those instructions(所有-f命令)后加载PostGIS。升级也是一个好主意,但这取决于你。

+0

我目前正在运行9.1.4,我相信它是最新版本的postgres。 – tomciopp

+0

是的,我发现我需要像这样做“古老的方式”,即使在第9.4页。不知道为什么EXTENSION命令没有解决我的问题。我碰到OpenStreetMap维基上的这些指令(运行这些SQL文件):http://wiki.openstreetmap.org/wiki/PostGIS/Installation#Ubuntu_14.10.2B_2 –

17

在公共模式中删除PostGIS扩展并在postgis模式中重新创建它。

DROP EXTENSION PostGIS; 

CREATE SCHEMA postgis; 
CREATE EXTENSION PostGIS WITH SCHEMA postgis; 
GRANT ALL ON postgis.geometry_columns TO PUBLIC; 
GRANT ALL ON postgis.spatial_ref_sys TO PUBLIC 
+0

database.yml也应该修改到'schema_search_path:public,postgis' – Jerome

0

确保您已安装此

sudo apt-get install postgresql-9.3-postgis 

我面临同样的问题,由于缺少这个包。

2

实际上,安装命令需要向前调用的PostGIS版本

sudo apt-get install -y postgis postgresql-9.3-postgis-2.1 

最简单的方法,然后申报

sudo -u postgres psql -c "CREATE EXTENSION postgis" your-pg-database-name 

避免迁移打嗝。

0

我有同样的问题,除了@ Raido的解决方案修复了db:migrate的问题时,创建租户时(例如db:seed期间),我仍然遇到了Apartment gem问题。

我发现Rails自动将enable_extension "postgis"添加到了schema.rb中,Apartment用它来创建租户模式。我不确定Apartment为什么不使用现有的postgis扩展(在租户创建时可能是search_path的问题),但这会导致相同的错误。

解决方案(如果你可以这么称呼的话)就是简单地从schema.rb中删除enable_extension "postgis"行。这种方法唯一的问题是,触发schema.rb刷新的任何后续迁移都会导致该行被重新添加。

此外,我使用公寓方法将postgis扩展添加到shared_extensions架构而不是它自己的。我的lib /任务/ db_extensions.rake样子:

namespace :db do 
    desc 'Also create shared_extensions Schema' 
    task :extensions => :environment do 
    # Create Schema 
    ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;' 
    # Enable Hstore 
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;' 
    # Enable uuid-ossp for uuid_generate_v1mc() 
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;' 
    # Enable postgis extension for geographic data types 
    ActiveRecord::Base.connection.execute 'DROP EXTENSION IF EXISTS postgis;' 
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION postgis WITH SCHEMA shared_extensions;' 
    ActiveRecord::Base.connection.execute 'GRANT USAGE ON SCHEMA shared_extensions to PUBLIC;' 
    puts 'Created extensions' 
    end 
end 

Rake::Task["db:create"].enhance do 
    Rake::Task["db:extensions"].invoke 
end 

Rake::Task["db:test:purge"].enhance do 
    Rake::Task["db:extensions"].invoke 
end 

我的database.yml的样子:

postgis_options: &postgis_options 
    adapter: postgis 
    postgis_extension: postgis # default is postgis 
    postgis_schema: shared_extensions # default is public 

default: &default 
    schema_search_path: 'public,shared_extensions' 
    encoding: utf8 
    <<: *postgis_options 

... 

production: 
    <<: *default 
    url: <%= ENV['DATABASE_URL'].try(:sub, /^postgres/, 'postgis') %> 

不理想,但它的工作。也许这可以通过PostGIS和Apartment节省一两个小时。我很想知道是否有任何人比从schema.rb中删除enable_extension调用有更好的解决方案:)