【发布时间】:2010-12-23 19:31:36
【问题描述】:
环境:
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]]
这是一个错误,还是我不理解的预期行为?我可以覆盖它,最好总是强制数据吗?如果没有,有什么想法可以最好地处理数据,以便在开发和生产中得到相同的结果?
【问题讨论】:
-
摘录的代码有错字吗?第一个
select_one似乎返回一个包含单个字符串元素的数组,第二个返回一个包含单个 DateTime 对象的单个数组元素的数组。 -
我当然可能打错字了,但请注意,封闭对象不是数组,而是 DBI::Row。 IRB 将其格式化在括起来的括号中,您可以调用 [0] 来获取结果。至于内括号,我不确定......
标签: ruby-on-rails ruby odbc dbi