【问题标题】:Postgresql extension not enabled in test environment测试环境中未启用 Postgresql 扩展
【发布时间】:2012-10-04 03:08:17
【问题描述】:

我有一个带有名为 shape 的多边形列的 postgres 表。为了确定一个点是否在里面,我跑了

select * from areas where shape @> point '(1,1)';

这一切都很好,可以在我的 ruby​​ on rails 应用程序中运行,但在我的 RSpec 测试中失败了。当我查看我的日志时,我发现这个错误是来源

 PGError: ERROR:  operator does not exist: character varying @> point
 HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

使用数据库的所有其他 50 多个测试都可以工作,只有这一个可以使用。它再次在代码和控制台中工作。测试环境全部设置妥当。

我的问题: - 我怎样才能使比较对象起作用? - 为什么它只会在测试中失败?

【问题讨论】:

  • 您是否不小心在测试环境中使用了不同类型的数据库(例如 mysql)?
  • @DavidGrayson: PGError 表示 PostgreSQL,所以我认为这不是问题所在。
  • >您的测试数据库中是否加载了所有必需的 PostgreSQL 扩展?我没有为此做任何具体的事情。它是一种简单的几何类型,不需要对我的知识进行任何扩展。
  • 从多边形(形状)@>点'(1,1)'的区域中选择*;多边形演员修复了它。然后我发现在我的测试数据库中,列的形状是字符串。这就是为什么它抱怨形状。所以我放弃了我的数据库,运行 rake db:dump 来创建 schema.rb,我的多边形类型又是字符串。我怎样才能让它知道多边形?在数据库中列肯定是多边形的。

标签: ruby-on-rails postgresql rspec


【解决方案1】:

默认情况下,activerecord 使用 schema.rb 使测试数据库与您的开发数据库保持同步。 Schema.rb 是独立于数据库的(它使用与迁移相同的结构),但另一方面是它并不倾向于支持数据库可能拥有的所有花里胡哨,尤其是像 Postgres 这样添加了很多额外内容的数据库。

您可以将config.active_record.schema_format 设置为:sql,而不是使用数据库自​​己的工具来生成rails 将丢失的.sql 文件而不是schema.rb。您将失去针对不同数据库运行测试的能力,但如果您使用的是 postgres 特定的扩展,那么无论如何您都处于这种情况。

另一种可能性是增强活动记录的模式转储器以了解多边形列。外国人gem例如为schema.rb添加外键支持

【讨论】:

  • 我找到了这个解决方法。运行 rake db:test:clone_structure。并且只使用“rspec”而不是“rake spec”来运行测试,因为这总是会重新生成结构并且无论如何都会慢得多。所以这有点工作。
【解决方案2】:

该错误似乎表明shape 列被定义为varchar。检查以确保它是一个多边形。

\d areas

【讨论】:

  • 在我的开发环境中它是一个多边形,再次验证了这一点。当我运行 rake db:schema:dump 并查看 schema.rb 时,它再次被归类为普通字符串。
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多