【问题标题】:Rails + PostGIS errors migrating databaseRails + PostGIS 错误迁移数据库
【发布时间】:2012-08-24 18:51:56
【问题描述】:

我一直在关注 Daniel Azuma 在 geospatial analysis with rails 上的演讲,但每当我在第二个项目中运行 rake db:migrate 时都会遇到困难。

我的设置细节如下:我正在使用Postgres.app 运行 Postgresql,它为我提供了 Postgres 9.1.3 版和 PostGIS 2.0.0 版。我在 database.yml 文件和运行迁移时遇到了一些问题。 (我已在 application.rb 中添加了相关的 gem 并要求提供他们的信息)

我的 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'

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

【问题讨论】:

  • 包含一个将多边形作为数据类型引用的迁移。但是我不认为需要为几何列表创建额外的迁移我认为它应该引用 postgis 适配器
  • 您对此有解决方案吗?我有同样的问题
  • 在下面查看我的解决方案。

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


【解决方案1】:

我遇到了同样的问题,除了 @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 刷新的后续迁移都会导致重新添加该行。

另外,我使用 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 调用更好的解决方案 :)

【讨论】:

    【解决方案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
    

    避免迁移问题。

    【讨论】:

      【解决方案3】:

      确保你已经安装了这个

      sudo apt-get install postgresql-9.3-postgis
      

      由于缺少这个包裹,我遇到了同样的问题。

      【讨论】:

        【解决方案4】:

        这是我解决问题的方法。我首先创建了一个新的迁移来将 postgis 添加到数据库中。 (我已经在 mac 上通过 homebrew 安装了 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();
        

        【讨论】:

        • 为了清楚起见,迁移文件应该如下所示: class AddPostgisToDatabase
        • @will rails g migration 会给你一个模板来添加这个代码,所以把它放在change 块中或者编写你自己的up 方法。
        • 迟到了... @tomciopp 我已经在我的 Mac 上的应用程序上使用了您的解决方案,它解决了这个问题。但是,在较新的应用程序上,此 CREATE EXTENSION 迁移会导致相同的错误。我的结论是在安装过程中上游的某些任务丢失了..
        【解决方案5】:

        在公共模式中删除 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
        

        【讨论】:

        • database.yml 也要修改为schema_search_path: public, postgis
        【解决方案6】:

        您使用的是哪个版本的 PostgreSQL? EXTENSION 事情 appeared in 9.1。扩展是一种在一个包中加载多个对象的便捷方式。

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

        【讨论】:

        • 我目前正在运行 9.1.4,我认为这是最新版本的 postgres。
        • 是的,我发现即使在第 9.4 页上,我也需要像这样“以旧方式”进行操作。不知道为什么 EXTENSION 命令没有为我解决问题。我在 OpenStreetMap wiki 上找到了这些指令,它们相当于(运行这些 SQL 文件):wiki.openstreetmap.org/wiki/PostGIS/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        相关资源
        最近更新 更多