2012-08-30 17 views
12

मैं geospatial analysis with rails पर डैनियल अज़ुमा की बात का पालन कर रहा था लेकिन जब भी मैं दूसरी परियोजना में rake db:migrate चलाता हूं तो मुझे कठिनाई हो रही है।रेल + पोस्टजीआईएस त्रुटियां डेटाबेस माइग्रेट कर रही हैं

मेरे सेटअप का विवरण निम्नानुसार है: मैं Postgres.app का उपयोग कर पोस्टग्रेस्क्ल चला रहा हूं जो मुझे पोस्टग्रेस का संस्करण 9.1.3 और पोस्टजीआईएस के 2.0.0 देता है। मैं डेटाबेस.आईएमएल फ़ाइल के साथ कुछ मुद्दों में चलाता हूं, और माइग्रेशन चला रहा हूं। (मैं प्रासंगिक जवाहरात जोड़ा गया है और 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' 

क्या किसी को भी इन मुद्दों को ठीक करने का विचार है?

+0

माइग्रेशन में एक पॉलीगॉन डेटा प्रकार के रूप में संदर्भित किया गया है। हालांकि मुझे विश्वास नहीं है कि एक ज्यामिति स्तंभ तालिका के लिए एक अतिरिक्त माइग्रेशन बनाने की आवश्यकता है, मुझे लगता है कि इसे पोस्टगिस एडाप्टर – tomciopp

+0

का संदर्भ देना चाहिए क्या आपको इस पर कोई समाधान मिला? मुझे एक ही समस्या है – Martin

+0

नीचे मेरा समाधान देखें। – tomciopp

उत्तर

9

यहां इस मुद्दे को हल किया गया है। मैंने डेटाबेस में पोस्टगिस जोड़ने के लिए पहले एक नया माइग्रेशन बनाया था। (मैं पहले से ही दोनों पर एक मैक homebrew के माध्यम से PostGIS और PostgreSQL स्थापित किया है।)

rails g migration add_postgis_to_database 

प्रवास फ़ाइल में मैं परिवर्तन विधि हटाया और विधि पर अमल के लिए इस्तेमाल किया PostGIS जोड़ने के लिए।

execute("CREATE EXTENSION postgis;") 

इसके बाद आप यह सुनिश्चित करने के लिए डेटाबेस की जांच कर सकते हैं कि पोस्टगिस उपलब्ध है।

psql your_database_name 
SELECT PostGIS_full_version(); 
+0

धन्यवाद यह काम करता है !! – joselo

+1

बस स्पष्ट होना, प्रवास फ़ाइल की तरह लग रहे करने के लिए माना जाता है: वर्ग AddPostgisToDatabase Will

+0

@will 'रेल जी migration' आप के लिए एक टेम्पलेट दे देंगे इस कोड को जोड़ें, इसलिए इसे 'चेंज' ब्लॉक के अंदर रखें या अपनी 'अप' विधि लिखें। – tadman

2

पोस्टग्रेएसक्यूएल का कौन सा संस्करण आप उपयोग कर रहे हैं? EXTENSION बात appeared in 9.1। एक्सटेंशन एक पैकेज में कई ऑब्जेक्ट्स लोड करने का एक आसान तरीका है।

यदि आप 9.1 से कम हैं तो आप those instructions (सभी -f कमांड) के बाद पोस्टजीआईएस लोड करने में सक्षम होंगे। अपग्रेड करना भी एक अच्छा विचार हो सकता है, लेकिन यह आपके ऊपर है।

+0

मैं वर्तमान में 9.1.4 चला रहा हूं जो मुझे लगता है कि पोस्टग्रेज़ का सबसे वर्तमान संस्करण है। – tomciopp

+0

हां मैंने पाया कि मुझे इसे "पुराना तरीका" करने की आवश्यकता है, यहां तक ​​कि पीजी 9.4 पर भी। निश्चित नहीं है कि EXTENSION आदेशों ने मेरे लिए समस्या को ठीक क्यों नहीं किया। मैंने OpenStreetMap विकी पर इन निर्देशों पर हिट किया जो एक ही चीज़ (इन एसक्यूएल फाइलों को चलाने) की राशि है: http://wiki.openstreetmap.org/wiki/PostGIS/Installation#Ubuntu_14.10.2B_2 –

17

सार्वजनिक स्कीमा में पोस्ट पोस्ट जीआईएस विस्तार और पोस्टगिस स्कीमा में इसे फिर से बनाएं।

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

डेटाबेस.इम भी संशोधित किया जाना चाहिए 'schema_search_path पर: सार्वजनिक, postgis' – Jerome

0

सुनिश्चित करें कि आप की वजह से इस पैकेज को यह याद आ रही

sudo apt-get install postgresql-9.3-postgis 

मैं का सामना करना पड़ रहा था एक ही मुद्दा स्थापित किया है सुनिश्चित करें।

2

वास्तव में, स्थापित आदेश 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 

परहेज प्रवास हिचकी घोषित करने के लिए की जरूरत है।

0

मेरे पास एक ही समस्या थी, जबकि @ राइडो के समाधान ने डीबी के लिए समस्या तय की: माइग्रेट, जब भी किरायेदार बनाया गया था (उदाहरण के लिए डीबी: बीज के दौरान) मुझे अपार्टमेंट मणि के साथ समस्याएं थीं।

मुझे पता चला कि रेल स्वचालित रूप से enable_extension "postgis" को schema.rb में जोड़ रहे थे, जो अपार्टमेंट किरायेदार स्कीमा बनाने के लिए उपयोग करता है। मुझे यकीन नहीं है कि अपार्टमेंट मौजूदा पोस्टगिस एक्सटेंशन का उपयोग क्यों नहीं करता है (शायद किरायेदार सृजन के समय search_path के साथ एक मुद्दा), लेकिन इसके परिणामस्वरूप एक ही त्रुटि होती है।

समाधान (यदि आप इसे कॉल कर सकते हैं) तो schema.rb से enable_extension "postgis" लाइन को निकालना था। इस दृष्टिकोण के साथ एकमात्र समस्या यह है कि किसी भी बाद के माइग्रेशन जो स्कीमा.आरबी रीफ्रेश को ट्रिगर करते हैं, परिणाम को फिर से जोड़ा जा रहा है।

इसके अलावा, मैंने पोस्टगिस एक्सटेंशन को इसके बजाय साझा_extensions स्कीमा में जोड़ने का अपार्टमेंट दृष्टिकोण उपयोग किया। मेरे lib/कार्य/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') %> 

आदर्श नहीं है, लेकिन यह काम कर रहा है। शायद यह पोस्टजीआईएस और अपार्टमेंट के साथ किसी एक या दो घंटे बचाएगा। मुझे यह जानने में दिलचस्पी होगी कि क्या किसी के पास schema.rb से enable_extension कॉल को हटाने से बेहतर समाधान है :)

संबंधित मुद्दे