2012-08-30 8 views
12

Stavo seguendo il discorso di Daniel Azuma su geospatial analysis with rails ma ho difficoltà quando eseguo rake db:migrate nel secondo progetto.Rails + Errori PostGIS migrazione database

I dettagli del mio setup sono i seguenti: Sto eseguendo Postgresql usando Postgres.app che mi dà la versione 9.1.3 di Postgres e 2.0.0 di PostGIS. Ho riscontrato alcuni problemi con il file database.yml e ho eseguito le migrazioni. (Ho aggiunto le gemme rilevanti e necessarie le loro informazioni in application.rb)

Il mio file database.yml si presenta così:

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

Se posso aggiungere la seguente riga schema_search_path: "public,postgis" ottengo:

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

Se rimuovo quella linea ricevo il seguente errore quando provo a migrare il mio database:

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' 

Qualcuno ha un'idea su come risolvere questi problemi?

+0

Esiste una migrazione inclusa che fa riferimento a un poligono come tipo di dati. Tuttavia, non credo che sia necessario creare una migrazione aggiuntiva per una tabella di colonne geometriche. Penso che dovrebbe fare riferimento all'adattatore postgis – tomciopp

+0

Hai trovato una soluzione su questo? Ho lo stesso problema – Martin

+0

Controlla la mia soluzione qui sotto. – tomciopp

risposta

9

Ecco come ho risolto il problema. Ho prima creato una nuova migrazione per aggiungere postgis al database. (Ho già installato sia postgis e PostgreSQL attraverso homebrew su un MAC.)

rails g migration add_postgis_to_database 

Nel file di migrazione ho rimosso il metodo di modifica e usato il metodo di esecuzione per aggiungere POSTGIS.

execute("CREATE EXTENSION postgis;") 

Successivamente è possibile controllare il database per assicurarsi che postgis sia disponibile.

psql your_database_name 
SELECT PostGIS_full_version(); 
+0

Grazie funziona !! – joselo

+1

Giusto per essere chiari, si suppone che il file di migrazione a guardare come: classe AddPostgisToDatabase Will

+0

@will 'rails g migration' vi darà un modello per aggiungi questo codice, quindi mettilo nel blocco 'change' o scrivi il tuo metodo' up'. – tadman

2

Quale versione di PostgreSQL stai usando? La cosa EXTENSIONappeared in 9.1. Le estensioni sono un modo pratico per caricare diversi oggetti in un unico pacchetto.

Se hai meno di 9.1, probabilmente sarai in grado di caricare PostGIS dopo those instructions (tutti i comandi -f). Potrebbe anche essere una buona idea aggiornare, ma dipende da te.

+0

Attualmente sto eseguendo 9.1.4 che credo sia la versione più recente di postgres. – tomciopp

+0

Sì, ho trovato che avevo bisogno di farlo "alla vecchia maniera" come questo anche a pg 9.4. Non sono sicuro del motivo per cui i comandi di ESTENSIONE non hanno risolto il problema per me. Ho seguito queste istruzioni sul wiki di OpenStreetMap che equivalgono alla stessa cosa (eseguendo questi file SQL): http://wiki.openstreetmap.org/wiki/PostGIS/Installation#Ubuntu_14.10.2B_2 –

17

Eliminare l'estensione PostGIS nello schema pubblico e ricrearla nello schema 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 dovrebbe anche essere modificato a 'schema_search_path: public, postgis' – Jerome

0

Accertarsi di aver installato questo stesso problema

sudo apt-get install postgresql-9.3-postgis 

stavo affrontando a causa della mancanza di questo pacchetto.

2

In realtà, il comando di installazione deve chiamare la versione postgis

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

Il modo più semplice in avanti viene quindi dichiarare

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

evitando singhiozzo migrazione.

0

Ho avuto lo stesso problema, tranne che mentre la soluzione di @ @ Raido risolveva il problema per db: migrate, stavo ancora avendo problemi con la gemma di Apartment quando veniva creato un tenant (ad es. Durante db: seed).

Ho scoperto che Rails stava aggiungendo automagicamente enable_extension "postgis" a schema.rb, che Apartment utilizza per creare lo schema del titolare. Non sono sicuro del motivo per cui Apartment non utilizzi l'estensione postgis esistente (forse un problema con il percorso di ricerca al momento della creazione del titolare), ma ciò comporta lo stesso errore.

La soluzione (se è possibile chiamarla così) era semplicemente rimuovere la riga enable_extension "postgis" da schema.rb. L'unico problema con questo approccio è che eventuali migrazioni successive che attivano un risultato di aggiornamento schema.rb nella linea che viene riaggiunta.

Inoltre, ho utilizzato l'approccio Apartment per aggiungere l'estensione postgis allo schema shared_extensions anziché il proprio. La mia lib/task/db_extensions.rake assomiglia:

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 

E il mio database.yml assomiglia:

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

Non è l'ideale, ma si sta lavorando. Forse questo salverà qualcuno un'ora o due con PostGIS e Apartment. Sarei interessato a sapere se qualcuno ha una soluzione migliore rispetto alla rimozione della chiamata enable_extension da schema.rb :)