connection.select_value只返回带有pg gem的postgres中的字符串

时间:2012-09-24 19:04:57

标签: mysql ruby-on-rails-3 postgresql activerecord pg

我正在将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获得正确输入的返回值?

2 个答案:

答案 0 :(得分:4)

简短的回答是否定的。 'pg'驱动程序故意在原生'libpq'驱动程序之上提供尽可能薄的层。它不进行类型转换,因为这是高级库的责任,它们可以深入了解将使用结果的域。该决定的基本原理记录在案on the PostgreSQL Wiki,我很乐意与您进一步讨论on the mailing list

答案 1 :(得分:0)

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

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

返回一个带有Rails的字符串< 4和带有Rails的Fixnum> = 4。

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