config.cache_classes = true, влияющий на приведение типов с помощью RubyDBI - PullRequest
2 голосов
/ 06 декабря 2009

Окружающая среда:
Рельсы 2.3.2
DBI 0.4.1
DBD / ODBC 0.2.4

Сценарий:
У меня есть приложение Rails, которое импортирует большую часть своих данных из внешних баз данных SQL в базу данных Rails SQL через обычные пакетные задания. Эти пакетные задания начинаются с загрузки среды 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]]

Это ошибка или ожидаемое поведение, которое я не понимаю? Могу ли я переопределить его, желательно всегда приводить данные? Если нет, то есть какие-нибудь мысли о том, как лучше всего массировать данные, чтобы они давали одинаковый результат при разработке и производстве?

1 Ответ

0 голосов
/ 24 декабря 2009

Нет, это поведение не является ожидаемым взаимодействием.

В качестве быстрого и грязного обходного пути вы можете явно CAST поле Lastupdate в строку, которая должна работать как в environments.rb.

Преобразование в простой числовой тип, такой как метка времени UNIX, также может работать.

Я не могу сказать, в чем заключается корневая проблема, и я не могу воспроизвести на тех же версиях Rails / AR и DBI, хотя, по общему признанию, с другим бэкэндом. Однако в обоих пакетах присутствует значительный динамизм, а AR частично загружает или модифицирует, а вспомогательный класс может не выполнить то, что ожидает DBI. (Некоторое время назад, например, адаптер AR для старой обезьяны postgres исправил базовый драйвер, сломав его для более старых версий соответствующего DBD.)

...