2

环境:
Rails 2.3.2
DBI 0.4.1
DBD/ODBC 0.2.4

场景:
我有一个 Rails 应用程序,它通过常规批处理作业将大部分数据从外部 SQL DB 导入 Rails SQL DB。这些批处理作业首先加载 Rails 环境,然后通过 RubyDBI 进行直接数据库连接。连接后,我运行 select 语句来提取数据、处理数据并构建 ActiveRecord 对象。

我刚刚遇到了一个奇怪的问题,即开发中的行为与生产中的行为不同。似乎当 config.cache_classes 为真时,DBI 停止正确地将返回的 SQL DATETIME 类型强制转换为 Ruby 日期时间。这是一个提取的代码示例:

## 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]]

这是一个错误,还是我不理解的预期行为?我可以覆盖它,最好总是强制数据吗?如果没有,有什么想法可以最好地处理数据,以便在开发和生产中产生相同的结果?

4

1 回答 1

0

不,这种行为不是预期的交互。

作为一种快速而肮脏的解决方法,您可以CASTLastupdate字段显式转换为字符串,这应该适用于两者environments.rb

转换为简单的数字类型(如 UNIX 时间戳)也可能有效。

我不能说根本问题是什么,而且我不能在相同版本的 Rails/AR 和 DBI 上重现,尽管我承认使用不同的后端。然而,这两个包中都有相当多的活力,并且 AR 部分加载或修改支持类可能无法满足 DBI 的预期。(例如,前一段时间,旧postgres驱动程序猴子的 AR 适配器修补了基本驱动程序,破坏了旧版本的相关 DBD。)

于 2009-12-24T17:32:16.163 回答