【问题标题】:config.cache_classes = true affecting type coercion with RubyDBIconfig.cache_classes = true 影响 RubyDBI 的类型强制
【发布时间】: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


【解决方案1】:

不,此行为不是预期的交互。

作为一种快速而肮脏的解决方法,您可以将 Lastupdate 字段显式地CAST 转换为字符串,这应该在environments.rb 中都可以使用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2012-05-25
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多