环境:
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为true时,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]]
这是一个错误,还是我不理解的预期行为?我可以覆盖它,最好总是强制数据吗?如果没有,是否有关于按摩数据的最佳方法的想法,以便在开发和生产中得到相同的结果?
答案 0 :(得分:0)
不,这种行为不是预期的互动。
作为一种快速而又肮脏的解决方法,您可以将 Lastupdate 字段CAST
显式地显示为字符串,该字符串应该同时适用于environments.rb
。
转换为简单的数字类型(如UNIX时间戳)也可能有效。
我不能说根本问题是什么,我不能在相同版本的Rails / AR和DBI上重现,尽管不同的后端。然而,两个软件包中都有相当大的动力,而AR部分加载或修改支持类可能不会达到DBI所期望的水平。 (前段时间,例如,旧的 postgres 驱动程序猴子的AR适配器修补了基本驱动程序,打破了旧版本的相关DBD。)