2009-12-06 1 views
2

환경과 사실에 영향을 미치는 유형 강제 변환 :
레일 2.3.2
DBI 0.4.1
DBD/ODBC 0.2.4config.cache_classes = RubyDBI

시나리오 :
내가 가진 레일 응용 프로그램이 수입 대부분의 데이터는 외부 SQL DB에서 정기적 인 일괄 작업을 통해 Rails SQL DB로 전송됩니다. 이러한 배치 작업은 Rails 환경을로드 한 다음 RubyDBI를 통해 직접 데이터베이스 연결을 진행하는 것으로 시작합니다. 일단 연결되면 select 문을 실행하여 데이터를 추출하고 마사지 한 다음 ActiveRecord 객체를 작성합니다.

나는 프로덕션 환경에서의 동작이 다른 경우 이상한 문제가 발생했습니다. config.cache_classes가 true 일 때 DBI는 반환 된 SQL DATETIME 유형을 Ruby datetime으로 강제로 강제 중단합니다. 다음은 추출한 코드 예제입니다.

## config.cache_classes = true 
query = "select TOP 1 [EPOLeafNode].[Lastupdate] AS last_update from [EPOLeafNode]" 
conn = DBI.connect('dbi:ODBC:DRIVER=FreeTDS;TDS_Version=8.0;SERVER=sql;DATABASE=EOP;uid=uid;pwd=pwd;') 
conn.select_one(query) 
=> ["2008-11-05 20:53:26.000"] 

## config.cache_classes = false 
query = "select TOP 1 [EPOLeafNode].[Lastupdate] AS last_update from [EPOLeafNode]" 
conn = DBI.connect('dbi:ODBC:DRIVER=FreeTDS;TDS_Version=8.0;SERVER=sql;DATABASE=EOP;uid=uid;pwd=pwd;') 
conn.select_one(query) 
=> [[Wed, 05 Nov 2008 20:53:26 +0000]] 

이것은 이해할 수없는 버그입니까? 데이터를 무효화 할 수 있습니까? 그렇지 않다면 데이터를 마사지하는 가장 좋은 방법에 대한 생각은 개발과 생산에서 동일한 결과를 낳습니까?

+0

발췌 한 코드가 잘못 입력 되었습니까? 첫 번째 'select_one'은 단일 문자열 요소가있는 배열을 반환하고 두 번째 배열은 단일 DateTime 객체를 포함하는 단일 배열 요소가있는 배열을 반환합니다. – pilcrow

+0

필자는 typo'd something을 할 수도 있지만, 둘러싸는 객체가 배열이 아니라 DBI :: Row라는 것을주의하십시오. IRB는 대괄호로 묶어 서식을 지정하고 [0]을 호출하여 결과를 얻을 수 있습니다. 안쪽 괄호에 관해서, 나는 확실하지 않다 ... –

답변

0

아니요.이 동작은 예상되는 상호 작용이 아닙니다. 신속하고 더러운 해결 방법으로

, 당신은 명시 적으로 CAST한다고 문자열로 LASTUPDATE 필드는 모두 environments.rb에서 작동 할 수 있습니다.

UNIX 타임 스탬프와 같은 단순한 숫자 형식으로 변환해도 작동 할 수 있습니다.

루트 문제가 무엇인지 말할 수 없으며 다른 백엔드를 사용하더라도 동일한 버전의 Rails/AR 및 DBI에서 재현 할 수 없습니다. 그러나 두 패키지에는 상당한 역 동성이 있습니다. 그리고 AR은 부분적으로로드하거나 수정하는 경우 지원되는 클래스가 DBI가 기대하는 바를 수행하지 않을 수도 있습니다. 예를 들어 예전의 postgres의 AR 어댑터는 관련된 DBD의 구버전에서 기본 드라이버를 패치하여 드라이버을 패치했습니다.

관련 문제