gpt4 book ai didi

ruby-on-rails - config.cache_classes = true 影响 RubyDBI 的类型强制

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:44 24 4
gpt4 key购买 nike

环境:
rails 2.3.2
动态接口(interface) 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]]

这是错误,还是我不理解的预期行为?我可以覆盖它,最好总是强制数据吗?如果不是,是否有关于处理数据以在开发和生产中产生相同结果的最佳方式的想法?

最佳答案

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

作为一种快速而肮脏的解决方法,您可以显式地将 Lastupdate 字段CAST 成一个字符串,这应该在两个 environments.rb.

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

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

关于ruby-on-rails - config.cache_classes = true 影响 RubyDBI 的类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1856527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com