Подтвердить что ты не робот

Ошибки Rails + PostGIS, переносящие базу данных

Я следил за тем, как Даниэль Азума говорил о геопространственном анализе с рельсами, но у меня возникают трудности, когда я запускаю rake db:migrate во втором проекте.

Детали моей настройки следующие: я запускаю Postgresql, используя Postgres.app, который дает мне версию 9.1.3 Postgres и 2.0.0 PostGIS. Я сталкиваюсь с несколькими проблемами с файлом 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'

Есть ли у кого-нибудь идея по устранению этих проблем?

4b9b3361

Ответ 1

Вот как я решил проблему. Сначала я создал новую миграцию для добавления postgis в базу данных. (Я уже установил как postgis, так и postgresql через homebrew на mac.)

rails g migration add_postgis_to_database

В файле миграции я удалил метод изменения и использовал метод execute для добавления POSTGIS.

execute("CREATE EXTENSION postgis;")

После этого вы можете проверить базу данных, чтобы убедиться, что postgis доступен.

psql your_database_name
SELECT PostGIS_full_version();

Ответ 2

Отбросить расширение 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

Ответ 3

Какую версию PostgreSQL вы используете? EXTENSION вещь появилась в 9.1. Расширения - это удобный способ загрузки нескольких объектов в один пакет.

Если у вас меньше 9.1, вы, вероятно, сможете загрузить PostGIS после этих инструкций (все команды -f), Это может быть хорошей идеей для обновления, но это зависит от вас.

Ответ 4

Собственно, команде 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

избегая миграции икоты.

Ответ 5

Убедитесь, что вы установили этот

sudo apt-get install postgresql-9.3-postgis

Я столкнулся с такой же проблемой из-за отсутствия этого пакета.

Ответ 6

У меня была такая же проблема, за исключением того, что решение @Raido исправило проблему для db: migrate, у меня все еще возникали проблемы с жемчужиной квартиры, когда был создан арендатор (например, во время db: seed).

Я обнаружил, что Rails автоматически добавлял enable_extension "postgis" в schema.rb, который Apartment использует для создания схемы арендатора. Я точно не знаю, почему Apartment не использует существующее расширение postgis (возможно, проблему с поисковым_панелем во время создания арендатора), но это приводит к той же ошибке.

Решение (если вы можете это назвать) было просто удалить строку 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:)