Rails + Postgis:错误无法删除表spatial_ref_sys

Mar*_*rco 6 postgresql postgis ruby-on-rails

Rails 5
Postgresql 9.4.10
Postgis 2.1.8

当我尝试rake db:reset时,控制台显示错误

rake aborted! ActiveRecord::StatementInvalid:
PG::DependentObjectsStillExist: ERROR:  cannot drop table
spatial_ref_sys because extension postgis requires it HINT:  You can
drop extension postgis instead. : DROP TABLE "spatial_ref_sys" CASCADE
Run Code Online (Sandbox Code Playgroud)

我是psql和postgis的新手,任何帮助将不胜感激.

dkn*_*fin 5

当我使用enable_extension :postgis. 这具有启用扩展的预期效果,但它也更新了我的db/schema.rb文件以包含spatial_ref_syspostgis 所需的此表。

但是,我们不希望db/schema.rb文件包含这个表,因为这样 a db:dropordb:reset会尝试删除该表,我们会得到这个错误。

要告诉 rails 忽略此表,我们可以在 末尾添加以下内容config/environment.rb

ActiveRecord::SchemaDumper.ignore_tables = ["spatial_ref_sys"]
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记create_tabledb/schema.rb.


ice*_*cem 5

这个特殊的表带有 PostGIS 扩展。它是自动添加的。您的 schema.rb 可能包含行:create_table "spatial_ref_sys", primary_key: "srid", id: :integer, force: :cascade do |t|

然后您尝试使用rake db:reset重新创建数据库,或者使用rake. 因为force设置了选项,所以它首先删除现有表,但 postgis 需要它。

快速解决方案是在某些初始值设定项中忽略此表:

::ActiveRecord::SchemaDumper.ignore_tables |= %w(spatial_ref_sys)
Run Code Online (Sandbox Code Playgroud)

然后运行rake db:migrate刷新您的 schema.rb 就完成了。

但更有可能的是,您希望使用 gem activerecord-postgis-adapter来使用一些 PostGIS 功能。它还将为您修复 schema.rb。