2016-01-11 52 views
10

Sto utilizzando db/structure.sql per preservare il nostro stato DB poiché abbiamo estensioni e funzioni incorporate che rendono impraticabile l'utilizzo di schema.rb.Rails db: struttura: dump ha percorsi di ricerca errati

Quando si eseguono le rotaie db:structure:dump ha il comportamento strano di impostare i percorsi di ricerca vicino all'inizio E vicino alla fine del file. Il problema qui è che il percorso di ricerca nella parte superiore non è corretto, causando il fallimento di db:schema:load miseramente.

L'ho modificato manualmente al momento (ad esempio aggiungendo postgis al percorso di ricerca in alto), ma sarebbe bello se in qualche modo potessi ottenere correttamente il percorso di ricerca impostato dall'attività di dump.

database.yml

development: &dev 
    adapter: postgis 
    database: myapp_dev 
    host: localhost 
    encoding: utf8 
    template: template0 # Required for UTF8 encoding 
    postgis_extension: true 
    schema_search_path: "public,postgis" 

db/structure.sql

-- 
-- PostgreSQL database dump 
-- 

SET statement_timeout = 0; 
SET lock_timeout = 0; 
SET client_encoding = 'UTF8'; 
SET standard_conforming_strings = on; 
SET check_function_bodies = false; 
SET client_min_messages = warning; 

SET search_path = public, pg_catalog; 

... Table/Sequence/Index creation happens here ... 

-- 
-- PostgreSQL database dump complete 
-- 

SET search_path TO public,postgis; 

... Migrations inserted here ... 

Il problema qui, è che i tavoli hanno bisogno postgis nel percorso di ricerca da creare (che fanno utilizzare i tipi di dati postgis dopo tutto)

I p riprendi il secondo set di percorsi di ricerca viene aggiunto come risultato dei percorsi di ricerca impostati in database.yml.

È possibile ottenere le guide per posizionare il percorso di ricerca corretto nella parte superiore del file?

+0

È possibile impostare il percorso di ricerca nei file di configurazione del database anziché nelle configurazioni di Rails? –

+0

Posso (ALTER DATABASE db SET search_path = public, postgis;) Ma il punto di structure.sql è consentire a una nuova distribuzione di avere un ambiente di lavoro senza comandi sql manuali (altrimenti potrei semplicemente usare pg_dump e pg_restore). –

+1

AFAIK 'structure.sql' viene generato dallo shelling degli strumenti CLI di PostgreSQL, la configurazione di Rails non è coinvolta oltre a specificare i parametri di connessione di base.Ad ogni modo, se fai un ALTER DATABASE, questo dovrebbe apparire in 'structure.sql', no? –

risposta

1

Ho realizzato un progetto di prova e una sequenza ripetuta di azioni descritte in questione: tutto funziona correttamente! Ho notato la regolarità - structure.sql contiene codice:

SET search_path = public, pg_catalog; 

CREATE TABLE spatial_tests (
    id integer NOT NULL, 
    latlon postgis.geography(Point,4326), 
    geo_col postgis.geometry(Geometry,4326) 
); 

Prestare attenzione alla postgis prefisso al tipo di colonna. Codice come questo accade solo se l'estensione postgis vive nello schema postgis:

postgis_test=# \dx 
            List of installed extensions 
    Name | Version | Schema |        Description 
---------+---------+------------+--------------------------------------------------------------------- 
plpgsql | 1.0  | pg_catalog | PL/pgSQL procedural language 
postgis | 2.1.7 | postgis | PostGIS geometry, geography, and raster spatial types and functions 
(2 rows) 

E questo codice viene eseguito correttamente. In un altro caso, quando l'estensione PostGIS vive in regime pubblico, structure.sql assomiglia a questo:

SET search_path = public, pg_catalog; 

CREATE TABLE spatial_tests (
    id integer NOT NULL, 
    latlon geography(Point,4326), 
    geo_col geometry(Geometry,4326) 
); 

Qui alcun prefisso nei nomi di colonna e questo codice genera errori durante l'esecuzione.

Chris Noldus, verificare quale schema contiene estensione postgis nel database in cui si effettua il dump (è possibile farlo tramite il comando \dx nella console psql), potrebbe essere la causa del problema.

Situazione come questa può verificarsi dopo la creazione del database tramite rake db:create senza postgis_schema: postgis in database.yml. Puoi leggere i dettagli su questa opzione in activerecord-postgis-adapter documentation.

+0

Grazie per la risposta. Non ho più il problema, e non sono sicuro di cosa sia stato risolto - poiché è stata posta la domanda ho aggiornato le librerie e il motore di database, quindi presumo che uno di questi aggiornamenti abbia risolto il problema. –