12

我正在关注 Daniel Azuma 关于使用 rails 进行地理空间分析的演讲,但每当我rake db:migrate在第二个项目中运行时,我都会遇到困难。

我的设置细节如下: 我正在使用Postgres.app运行 Postgresql ,它为我提供了 Postgres 9.1.3 版和 PostGIS 2.0.0 版。我在 database.yml 文件和运行迁移时遇到了一些问题。(我已经添加了相关的 gem 并在 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'

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

4

6 回答 6

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
于 2012-09-28T19:45:59.703 回答
10

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

rails g migration add_postgis_to_database

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

execute("CREATE EXTENSION postgis;")

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

psql your_database_name
SELECT PostGIS_full_version();
于 2013-04-15T00:49:03.873 回答
3

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

避免迁移打嗝。

于 2014-11-15T09:04:09.757 回答
2

您使用的是什么版本的 PostgreSQL?这个EXTENSION东西出现在 9.1 中。扩展是一种在一个包中加载多个对象的便捷方式。

如果您使用的版本低于 9.1,您可能可以按照这些说明(所有-f命令)加载 PostGIS。升级也可能是个好主意,但这取决于您。

于 2012-08-31T01:41:41.143 回答
1

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

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

解决方案(如果你可以这么称呼它)是简单地enable_extension "postgis"从 schema.rb 中删除该行。这种方法的唯一问题是任何触发 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 节省一两个小时。我很想知道是否有人有比enable_extension从 schema.rb 中删除调用更好的解决方案 :)

于 2017-06-25T21:11:43.240 回答
0

确保你已经安装了这个

sudo apt-get install postgresql-9.3-postgis

由于缺少此包裹,我面临同样的问题。

于 2014-09-24T12:32:05.273 回答