2012-08-30 21 views
12

Tôi đang theo dõi cuộc trò chuyện của Daniel Azuma trên geospatial analysis with rails nhưng tôi gặp khó khăn mỗi khi tôi chạy rake db:migrate trong dự án thứ hai.Rails + PostGIS lỗi di chuyển cơ sở dữ liệu

Chi tiết về thiết lập của tôi như sau: Tôi đang chạy Postgresql bằng cách sử dụng Postgres.app cho tôi phiên bản 9.1.3 của Postgres và 2.0.0 của PostGIS. Tôi gặp phải một số vấn đề với tệp database.yml và chạy di chuyển. (Tôi đã thêm đá quý có liên quan và yêu cầu thông tin của họ trong application.rb)

tập tin database.yml của tôi trông như thế này:

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

Nếu tôi thêm dòng sau schema_search_path: "public,postgis" tôi nhận được:

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

Nếu tôi loại bỏ dòng tôi nhận được lỗi sau khi tôi cố gắng để di chuyển cơ sở dữ liệu của tôi:

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' 

Có ai có ý tưởng về cách khắc phục những vấn đề này không?

+0

Có một di chuyển bao gồm tham chiếu một đa giác như một kiểu dữ liệu. Tuy nhiên tôi không tin rằng có một di chuyển bổ sung cần thiết để được tạo ra cho một bảng hình học cột Tôi nghĩ rằng nó nên tham khảo các bộ chuyển đổi Postgis – tomciopp

+0

Bạn đã nhận được một giải pháp về điều này? Tôi gặp vấn đề tương tự – Martin

+0

Kiểm tra giải pháp của tôi bên dưới. – tomciopp

Trả lời

9

Đây là cách tôi giải quyết vấn đề. Lần đầu tiên tôi tạo một di chuyển mới để thêm postgis vào cơ sở dữ liệu. (Tôi đã cài đặt cả postgis và postgresql thông qua homebrew trên máy mac.)

rails g migration add_postgis_to_database 

Trong tệp di chuyển, tôi đã xóa phương thức thay đổi và sử dụng phương thức thực thi để thêm POSTGIS.

execute("CREATE EXTENSION postgis;") 

Sau đó, bạn có thể kiểm tra cơ sở dữ liệu để đảm bảo rằng có sẵn bưu thiếp.

psql your_database_name 
SELECT PostGIS_full_version(); 
+0

Cảm ơn nó hoạt động !! – joselo

+1

Chỉ cần được rõ ràng, các tập tin chuyển đổi có nghĩa vụ phải trông giống như: lớp AddPostgisToDatabase Will

+0

@ Will 'đường ray g migration' sẽ cung cấp cho bạn một mẫu để thêm mã này vào, vì vậy hãy đặt nó vào trong khối 'change' hoặc viết phương thức' up' của riêng bạn. – tadman

2

Bạn đang sử dụng phiên bản PostgreSQL nào? EXTENSION điều appeared in 9.1. Tiện ích mở rộng là một cách thuận tiện để tải một số đối tượng trong một gói.

Nếu bạn dưới 9,1, bạn có thể tải PostGIS sau those instructions (tất cả lệnh -f). Nó cũng có thể là một ý tưởng tốt để nâng cấp, nhưng đó là tùy thuộc vào bạn.

+0

Tôi hiện đang chạy phiên bản 9.1.4 mà tôi tin là phiên bản mới nhất của postgres. – tomciopp

+0

Có, tôi thấy tôi cần phải làm điều đó "theo cách cũ" như thế này ngay cả trên trang 9.4. Không chắc chắn lý do tại sao các lệnh EXTENSION không khắc phục được sự cố cho tôi. Tôi nhấn vào các hướng dẫn này trên wiki OpenStreetMap có cùng giá trị (chạy các tệp SQL này): http://wiki.openstreetmap.org/wiki/PostGIS/Installation#Ubuntu_14.10.2B_2 –

17

Thả đăng mở rộng GIS trong lược đồ công cộng và tạo lại lược đồ đó trong lược đồ sau khi đăng.

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 cũng phải được sửa đổi tới 'schema_search_path: public, postgis' – Jerome

0

Hãy chắc chắn rằng bạn đã cài đặt cùng một vấn đề

sudo apt-get install postgresql-9.3-postgis 

tôi đã phải đối mặt với này do thiếu gói này.

2

Trên thực tế, quá trình cài đặt lệnh cần gọi phiên bản PostGIS

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

Cách đơn giản nhất về phía trước sau đó được tuyên bố

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

tránh trục trặc di cư.

0

Tôi gặp vấn đề tương tự, ngoại trừ khi giải pháp @ Raido khắc phục sự cố cho db: di chuyển, tôi vẫn gặp sự cố với đá quý Căn hộ khi người thuê được tạo (ví dụ: trong db: seed).

Tôi phát hiện ra rằng Rails đã tự động thêm enable_extension "postgis" vào schema.rb, căn hộ nào sử dụng để tạo lược đồ đối tượng thuê. Tôi không chắc chắn chính xác lý do tại sao Apartment không sử dụng phần mở rộng postgis hiện có (có thể là một vấn đề với search_path tại thời điểm tạo người thuê), nhưng điều này dẫn đến lỗi tương tự.

Giải pháp (nếu bạn có thể gọi nó) là chỉ cần xóa đường dây enable_extension "postgis" khỏi schema.rb. Vấn đề duy nhất với phương pháp này là mọi di chuyển tiếp theo sẽ kích hoạt kết quả làm mới schema.rb trong dòng đang được thêm lại.

Ngoài ra, tôi đã sử dụng phương pháp Căn hộ để thêm tiện ích mở rộng bưu phí vào lược đồ shared_extensions thay vì lược đồ của riêng nó. lib của tôi/nhiệm vụ/db_extensions.rake trông giống như:

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 

Và database.yml của tôi trông giống như:

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

Không lý tưởng, nhưng nó làm việc. Có lẽ điều này sẽ tiết kiệm một ai đó một hoặc hai giờ với PostGIS và căn hộ. Tôi muốn được quan tâm để biết nếu có ai có một giải pháp tốt hơn so với việc loại bỏ các cuộc gọi enable_extension từ schema.rb :)