9

我正在将一个 Rails 应用程序从使用 mysql (mysql2 gem) 转换为 postgres (pg gem)。

使用 mysql,ActiveRecord::Base.connection.select_value调用返回根据数据键入的值,例如:

> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> 86
> ActiveRecord::Base.connection.select_value("SELECT exception FROM errors where id=565")
=> "TechTalk.Genome.SqlExecutionException"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors where id=565")
=> 565

但是,使用 postgres,connection.select_value总是返回一个字符串:

> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT source FROM errors limit 1")
=> "webapp"

这破坏了一些单元测试,虽然这些是可以修复的,但我确信我们还有其他代码依赖于这些返回值。有没有办法在使用 postgres 时获得正确类型的返回值?connection.select_value

4

2 回答 2

4

最简洁的答案是不。'pg' 驱动程序有意在本机 'libpq' 驱动程序之上提供尽可能薄的层。它不进行类型转换,因为这是对使用结果的领域有一定了解的高级库的职责。这个决定的理由记录在 PostgreSQL Wiki 上,我很乐意在邮件列表中与您进一步讨论。

于 2012-09-24T21:39:11.537 回答
0

对于那些在这里寻找 activerecord 属性(Rails)特定答案的人:我已经做了一些测试(https://gist.github.com/gamov/8fe38733012931eb3360)并发现:

RequestedItem.where(id: 1).select(*, 10 AS tq).first.tq.class

返回 Rails < 4 的 String 和 Rails >= 4 的 Fixnum。

Postgres 适配器会将类型从 DB 转发到 Persistence 模块,因此可以透明地进行转换。

于 2014-10-15T08:18:21.743 回答