15

I received the following error while running my Rspec test suite:

PG::InternalError: ERROR:  GetProj4StringSPI: Cannot find SRID (4326) in spatial_ref_sys

I know that I enabled the PostGIS extension. How do I fix this?

3 Answers 3

38

The problem is that something removed the rows from the spatial_ref_sys table.

In my case, the problem was in my DatabaseCleaner configuration in my spec_helper.rb. It was configured to delete/truncate the table.

To prevent that behavior, change the configuration. For me, that was:

config.before(:suite) do
  DatabaseCleaner.strategy = :deletion, {:except => %w[spatial_ref_sys]}
  DatabaseCleaner.clean_with :truncation, {:except => %w[spatial_ref_sys]}
end

Now you'll need to regenerate the rows in that table. Use the script named spatial_ref_sys.sql to do that.

I use Postgres.app, so the command to run that script was:

/Applications/Postgres.app/Contents/MacOS/bin/psql -d database_name -f /Applications/Postgres.app/Contents/MacOS/share/contrib/postgis-2.0/spatial_ref_sys.sql

Your command may be slightly different.

Sign up to request clarification or add additional context in comments.

5 Comments

macports postgis: /opt/local/share/postgresql93/contrib/postgis-2.1/spatial_ref_sys.sql
I noticed that all I had to do was rerun rake db:test:prepare or rake spec to fix up the spacial_ref_sys table.
Damn, still doesn't work with v 1.5.1 - spatial_ref_sys is deleted everytime suite is executed
This might seem obvious, but you have a separate cleanup defined that uses delete or truncation, you'll need to add the {:except => %w[spatial_ref_sys]} there as well. This is really common for js feature tests IE config.before(:each, :js => true). Even if feature tests are not using postgis, if he feature tests are run before other tests then you'll run into the same problem when running the whole test suite
With newer versions of the Postgres app the directory is /Applications/Postgres.app/Contents/Versions/9.4/share/postgresql/contrib/postgis-2.1/
14

Running rake db:test:prepare should restore the values in spatial_ref_sys.

UPDATE: This is fixed in version 1.4.1: https://github.com/DatabaseCleaner/database_cleaner/pull/328

There is a bug in database_cleaner version 1.4.0, so you need to specify the schema of the table exceptions:

DatabaseCleaner.strategy = :truncation, { except: ["public.spatial_ref_sys"] }
DatabaseCleaner.clean_with :truncation, { except: ["public.spatial_ref_sys"] }

In version 1.4.0, the schema is returned as part of the table name. See https://github.com/DatabaseCleaner/database_cleaner/pull/282

Comments

4

This is due to not having a spatial_ref_sys table. Insert this table using the following:

psql -d country -f /usr/share/postgresql/9.3/contrib/postgis-2.1/spatial_ref_sys.

country is the database name, and /usr/share/.../spatial_ref_sys.sql is the path where my file is stored. This works for me.

2 Comments

/usr/local/Cellar/postgis/2.1.4_1/share/postgis/spatial_ref_sys.sql on my mac
Ubuntu: /usr/share/postgresql/12/contrib/postgis-2.5/spatial_ref_sys.sql

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.