환경과 사실에 영향을 미치는 유형 강제 변환 :
레일 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]]
이것은 이해할 수없는 버그입니까? 데이터를 무효화 할 수 있습니까? 그렇지 않다면 데이터를 마사지하는 가장 좋은 방법에 대한 생각은 개발과 생산에서 동일한 결과를 낳습니까?
발췌 한 코드가 잘못 입력 되었습니까? 첫 번째 'select_one'은 단일 문자열 요소가있는 배열을 반환하고 두 번째 배열은 단일 DateTime 객체를 포함하는 단일 배열 요소가있는 배열을 반환합니다. – pilcrow
필자는 typo'd something을 할 수도 있지만, 둘러싸는 객체가 배열이 아니라 DBI :: Row라는 것을주의하십시오. IRB는 대괄호로 묶어 서식을 지정하고 [0]을 호출하여 결과를 얻을 수 있습니다. 안쪽 괄호에 관해서, 나는 확실하지 않다 ... –