Rails + PostGIS ошибки миграции базы данных
Я следил за разговором Даниэля Азумы на геопространственный анализ с рельсами но у меня возникают трудности, когда я бегу rake db:migrate
во втором проекте.
подробности моей настройки следующие: Я запускаю Postgresql с помощью Postgres.app что дает мне версию 9.1.3 Postgres и 2.0.0 PostGIS. Я столкнулся с несколькими проблемами с базой данных.файл yml и запуск миграций. ( Я добавил соответствующие драгоценные камни и потребовал их информацию в приложение.rb)
базы данных.файл 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 ответов
удалите расширение 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
вот как я решил эту проблему. Сначала я создал новую миграцию для добавления postgis в базу данных. (Я уже установил postgis и postgresql через homebrew на mac.)
rails g migration add_postgis_to_database
в файле миграции я удалил метод change и использовал метод execute для добавления POSTGIS.
execute("CREATE EXTENSION postgis;")
после этого вы можете проверить базу данных, чтобы убедиться, что postgis доступен.
psql your_database_name
SELECT PostGIS_full_version();
какую версию PostgreSQL вы используете? The EXTENSION
вещь в 9.1. Расширения-удобный способ загрузки нескольких объектов в один пакет.
Если вы используете менее 9.1, вы, вероятно, сможете загрузить PostGIS после инструкции (всего -f
команды). Это также может быть хорошей идеей для обновления, но это зависит от вас.
На самом деле, команда 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
во избежание миграции икоты.
убедитесь, что вы установили этот
sudo apt-get install postgresql-9.3-postgis
я столкнулся с той же проблемой из-за отсутствия этого пакета.
у меня была та же проблема, за исключением того, что решение @Raido исправило проблему для db:migrate, у меня все еще были проблемы с GEM квартиры, когда был создан арендатор (например, во время db:seed).
я обнаружил, что Rails автоматически добавляет enable_extension "postgis"
для схемы.rb, который используется квартирой для создания схемы арендатора. Я не уверен, почему квартира не использует существующее расширение postgis (возможно, проблема с search_path во время создания арендатора), но это приводит в той же ошибке.
решение (если вы можете это назвать) состояло в том, чтобы просто удалить enable_extension "postgis"
строка из схемы.рубидий. Единственная проблема с этим подходом заключается в том, что любые последующие переносы, которые запускают схему.результат обновления rb в строке добавляется повторно.
кроме того, я использовал квартирный подход добавления расширения postgis в схему shared_extensions вместо собственного. Мой lib / задачи / db_extensions.рейк выглядит так:
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
и моя база данных.в формате 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 и квартирой. Мне было бы интересно узнать, есть ли у кого-нибудь лучшее решение, чем удаление enable_extension
звонок от схемы.rb:)