2012-08-30 8 views
12

Estaba siguiendo la charla de Daniel Azuma en geospatial analysis with rails pero estoy teniendo dificultades cada vez que ejecuto rake db:migrate en el segundo proyecto.Rails + PostGIS errors migración de la base de datos

Los detalles de mi configuración son los siguientes: Estoy ejecutando Postgresql usando Postgres.app que me da la versión 9.1.3 de Postgres y 2.0.0 de PostGIS. Me encontré con algunos problemas con el archivo database.yml y la ejecución de migraciones. (He añadido las gemas pertinentes y se requiere su información en application.rb)

Mi archivo database.yml se ve así:

development: 
    adapter: postgis 
    postgis_extension: true 
    host: localhost 
    encoding: unicode 
    database: my_app_development 
    pool: 5 
    username: my_app 
    password: 

Si añado la siguiente línea schema_search_path: "public,postgis" me sale:

rake aborted! 
PG::Error: ERROR: schema "postgis" does not exist 
: SET search_path TO public,postgis 

Si quito esa línea recibo el siguiente error al intentar migrar mi base de datos:

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' 

¿Alguien tiene una idea sobre cómo solucionar estos problemas?

+0

Se incluye una migración que hace referencia a un polígono como tipo de datos. Sin embargo, no creo que haya que realizar una migración adicional para una tabla de columnas de geometría, creo que debería hacer referencia al adaptador postgis – tomciopp

+0

. ¿Obtuvieron una solución al respecto? Tengo el mismo problema – Martin

+0

Compruebe mi solución a continuación. – tomciopp

Respuesta

9

Así es como he resuelto el problema. Primero creé una nueva migración para agregar postgis a la base de datos. (Ya he instalado tanto PostGIS y PostgreSQL a través de homebrew en un mac.)

rails g migration add_postgis_to_database 

En el archivo de migración Quité el método de cambio y utilizamos el método de ejecución para agregar Postgis.

execute("CREATE EXTENSION postgis;") 

Después de eso, puede consultar la base de datos para asegurarse de que Postgis esté disponible.

psql your_database_name 
SELECT PostGIS_full_version(); 
+0

¡Gracias, funciona! – joselo

+1

Para que quede claro, el archivo de migración se supone que parecen: clase AddPostgisToDatabase Will

+0

@will 'rieles g migration' le dará una plantilla para agrega este código a, así que ponlo dentro del bloque 'change' o escribe tu propio método' up'. – tadman

2

¿Qué versión de PostgreSQL estás usando? La cosa EXTENSIONappeared in 9.1. Las extensiones son una forma práctica de cargar varios objetos en un paquete.

Si tiene menos de 9.1, probablemente pueda cargar PostGIS después de those instructions (todos los comandos -f). También puede ser una buena idea actualizar, pero eso depende de usted.

+0

Actualmente estoy ejecutando 9.1.4, que creo que es la versión más actual de postgres. – tomciopp

+0

Sí, descubrí que tenía que hacerlo "a la vieja usanza" de esta manera, incluso en la página 9.4. No estoy seguro de por qué los comandos EXTENSIÓN no solucionaron el problema para mí. Apunto estas instrucciones en la wiki de OpenStreetMap que equivalen a lo mismo (ejecutando estos archivos SQL): http://wiki.openstreetmap.org/wiki/PostGIS/Installation#Ubuntu_14.10.2B_2 –

17

Coloque la extención de PostGIS en el esquema público y vuelva a crearlo en el esquema de 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 
+0

database.yml también debe ser modificado a 'schema_search_path: public, postgis' – Jerome

0

Asegúrese de que ha instalado esta misma edición

sudo apt-get install postgresql-9.3-postgis 

que estaba enfrentando debido a la falta de este paquete.

2

En realidad, el mandato de instalación necesita invocar la versión PostGIS

sudo apt-get install -y postgis postgresql-9.3-postgis-2.1 

La manera más simple hacia adelante es entonces declarar

sudo -u postgres psql -c "CREATE EXTENSION postgis" your-pg-database-name 

evitando contratiempos de migración.

0

Tuve el mismo problema, excepto cuando la solución de @Raido resolvió el problema de db: migrate, todavía tenía problemas con la gema de Apartamento cuando se creó un inquilino (por ejemplo, durante db: seed).

Descubrí que Rails estaba agregando automágicamente enable_extension "postgis" a schema.rb, que Apartment usa para crear el esquema de inquilino. No estoy seguro de por qué Apartment no utiliza la extensión Postgis existente (tal vez un problema con el search_path en el momento de la creación del inquilino), pero esto da como resultado el mismo error.

La solución (si se puede llamar así) era simplemente eliminar la línea enable_extension "postgis" de schema.rb. El único problema con este enfoque es que cualquier migración posterior que desencadene una actualización de schema.rb dará como resultado que la línea se vuelva a agregar.

Además, utilicé el enfoque de Apartamento para agregar la extensión de postgis al esquema shared_extensions en vez de su propio. Mi lib/tareas/db_extensions.rake parece:

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 

Y mi database.yml parece:

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') %> 

No es ideal, pero que está funcionando. Quizás esto le ahorrará a alguien una o dos horas con PostGIS y Apartamento. Me interesaría saber si alguien tiene una mejor solución que eliminar la llamada enable_extension de schema.rb :)

Cuestiones relacionadas