Rails + PostGIS错误迁移数据库

时间:2012-08-30 05:01:07

标签: ruby-on-rails postgresql geolocation geospatial postgis

我跟随Daniel Azuma关于geospatial analysis with rails的谈话但我在第二个项目中运行rake db:migrate时遇到了困难。

我的设置细节如下:我使用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'

有没有人知道如何解决这些问题?

6 个答案:

答案 0 :(得分:18)

在公共架构中删除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

答案 1 :(得分:10)

以下是我解决问题的方法。我首先创建了一个新的迁移,将postgis添加到数据库中。 (我已经在mac上通过自制软件安装了postgis和postgresql。)

rails g migration add_postgis_to_database

在迁移文件中,我删除了更改方法,并使用execute方法添加POSTGIS。

execute("CREATE EXTENSION postgis;")

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

psql your_database_name
SELECT PostGIS_full_version();

答案 2 :(得分:2)

您使用的是什么版本的PostgreSQL? EXTENSIONappeared in 9.1。扩展是在一个包中加载多个对象的便捷方式。

如果小于9.1,您可能可以在those instructions之后加载PostGIS(所有-f命令)。升级可能也是一个好主意,但这取决于你。

答案 3 :(得分:2)

实际上,install命令需要调用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

避免迁移打嗝。

答案 4 :(得分:0)

确保您已安装此

sudo apt-get install postgresql-9.3-postgis

由于错过了此套餐,我遇到了同样的问题。

答案 5 :(得分:0)

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

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

解决方案(如果你可以称之为)只是从schema.rb中删除enable_extension "postgis"行。此方法的唯一问题是,任何触发schema.rb刷新的后续迁移都会导致重新添加该行。

另外,我使用Apartment方法将postgis扩展添加到shared_extensions模式而不是自己的模式。我的lib / tasks / 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调用有更好的解决方案:)