如何将PostgreSQL整数作为Ruby整数返回,而不是字符串?

时间:2014-03-16 18:45:38

标签: ruby arrays postgresql

我有一个这样的数组:

chats = [
  ["1", "First 1 Last 1", "3 -> 1", "1394994921"],
  ["2", "First 2 Last 2", "2 -> 3", "1394994921"]
]

这是PGresult#values的回复。为什么是第一个&当它们实际上是String&时,每行中的最后一个元素作为bigint在Ruby中返回。 PostgreSQL中分别integer?如何让它们成为Ruby中的Fixnum

我想:

chats = [
  [1, "First 1 Last 1", "3 -> 1", 1394994921],
  [2, "First 2 Last 2", "2 -> 3", 1394994921]
]

3 个答案:

答案 0 :(得分:1)

显然,postgres Wire格式始终以字符串形式传输值,并且没有简单的方法(即没有额外的往返)来查找实际的数据类型,因此客户端库将所有内容都以字符串形式返回。

所以:

def psql_fix_int_field_stupidity(res,fields)
  res.map do |row|
    fields.each do |f|
      row[f]=row[f].to_i
    end
    row
  end
end

该函数通常可用于对结果集进行一半的修补:

psql_fix_int_field_stupidity(conn.exec( "SELECT * FROM product" ), %W< id, parent >)

但是您仍然需要知道列名。

答案 1 :(得分:0)

chats.each {|x| x[0] = x[0].to_i; x[-1] = x[-1].to_i}

答案 2 :(得分:0)

尝试通过以下方式启用基本类型转换:

conn.type_map_for_results = PG::BasicTypeMapForResults.new(conn)

来源:ruby-pg README.md: Type Casts