2012-09-24 4 views
9

레일즈 앱을 mysql (mysql2 gem)에서 postgres (pg gem)로 변환하고 있습니다. MySQL과connection.select_value는 pg gem이있는 postgres의 문자열 만 반환합니다.

, 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 

그러나, 포스트 그레스와 함께, 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" 

은 테스트가 가능하고 수정이 가능할 때까지는 이러한 반환 값에 의존하는 다른 코드가 있음을 확신합니다. 포스트 그레스를 사용할 때 connection.select_value에서 올바르게 형식화 된 반환 값을 얻는 방법이 있습니까?

답변

4

짧은 대답은 아니오입니다. 'pg'드라이버는 의도적으로 기본 'libpq'드라이버 위에 가능한 한 얇은 레이어를 제공합니다. 타입 캐스팅을 수행하지 않습니다. 결과가 사용될 도메인에 대한 통찰력이있는 상위 레벨 라이브러리의 책임입니다. 이 결정에 대한 이론적 근거는 on the PostgreSQL Wiki으로 기록되어 있으며, 더 자세히 상담해 드리겠습니다. on the mailing list.

+4

최악의 답변입니다! ;) 감사. –

+0

"네이티브 'libpq'드라이버 위에 가능한 한 얇은 레이어." 문제는, 루비의 문자열 할당은 실제로 꽤 비싸고, 너무 낭비스러운 것 같습니다. –

+0

각 열에 문자열을 할당하거나 PostgreSQL 유형을 루비에 기본적으로 매핑하는 것이 더 낭비가 될지도 모릅니다. 열 유형에 모두 Ruby에서 정확한 Numeric derived (BigNum이 아닌) 값이 있으면 문자열을 모두 표현하는 것이 낭비 일 것입니다. 그러나 비교적 희귀 한 환경에서 잠재적 인 메모리 낭비에 기반하여 부분적으로 완성 된 타입 매핑 시스템이 될 수있는 것을 구현하는 것은 나에게 무책임한 것처럼 보입니다. –

0
액티브 특성 (레일) 특정 대답을 찾고 여기에 착륙하는 사람들을 위해

: 나는 몇 가지 테스트 (https://gist.github.com/gamov/8fe38733012931eb3360)을했던 그 발견 :

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

가 레일 < (4) 및 문자열을 반환합니다 Fixnum with Rails> = 4

Postgres 어댑터는 DB에서 Persistence 모듈로 유형을 전달하여 캐스팅을 투명하게 수행 할 수 있습니다.

관련 문제