我们正在努力将我们的应用程序升级到最新版本的 Ruby & Rails。我们的应用程序与旧数据库 (SQL Server 2008 R2) 集成,该数据库具有包含图像数据类型列的表(我们无法将此列更改为 varbinary(max))。以前我们能够将二进制文件保存到图像列中。但是现在我们遇到了转换错误。
我们正在努力升级到以下(除其他外):
- 导轨 4.2.1
- ActiveRecord_SQLServer_Adapter (4.2.4)
- tiny_tds (0.6.3.rc1)
- freeTDS (v0.91.112)
当我们现在尝试保存到图像列时,我们会收到类似于以下内容的错误:
TinyTds::Error: 字符串后的未闭合引号
在研究 tiny_tds 和 activerecord_sqlserver_adapter 中的各种问题后,我们决定创建第二个与第一个匹配的表,但将数据类型从 image 更改为 varbinary(max)。我们可以将二进制文件保存到列中。
导致挑战的代码在后台作业中,我们从 s3 抓取图像,将它们存储在本地,然后将图像推送到数据库中。同样,我们不控制遗留数据库,因此无法更改数据类型(或者面临为什么我们首先将图像存储在数据库中的问题)。
...
@d = Doc.new
...
open("#{Rails.root}/cache/pictures/image.png", "wb") do |file|
file << open(r.image.url).read
end
@d.document = File.binread("#{Rails.root}/cache/pictures/image.png")
@d.save!
鉴于升级破坏了我们保存的图像,我们正试图找出如何最好地确定修复。我们显然可以回滚,直到我们找到一个有效的版本。不过我们希望能找到解决办法。有人有想法么?
更新:我们添加了以下配置,因为我们在要插入的表上有触发器:ActiveRecord::ConnectionAdapters::SQLServerAdapter.use_output_inserted = true
当我们删除此配置时,我们会收到以下错误:
TinyTds::Error: The target table 'doc' of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.
注意:我们无法对触发器进行任何修改。