我正在将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
获得正确输入的返回值?
答案 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模块,因此可以透明地完成转换。