gpt4 book ai didi

mysql - Ruby DBI 获取无法处理 MySQL 中的全零日期

转载 作者:行者123 更新时间:2023-11-29 22:10:32 24 4
gpt4 key购买 nike

我正在尝试使用一些相当简单的 CGI/Ruby 和 DBI 来访问我们的数据库:

#!/usr/bin/ruby -w

require "dbi"
dbh = DBI.connect("dbi:Mysql:my:mydb", "XXXX", "XXXX")

...

query = "select ETA from mydb.mytable where ID = #{someval}"
rows = dbh.execute(query)
while row = rows.fetch() do
# Do some stuff
...
end

大多数情况下都可以正常工作,但我创下了一个记录,并因错误而打破了它:

/usr/lib/ruby/vendor_ruby/dbd/Mysql.rb:120:in `parse': invalid date (ArgumentError)
from /usr/lib/ruby/vendor_ruby/dbd/Mysql.rb:120:in `parse'
from /usr/lib/ruby/vendor_ruby/dbi/row.rb:66:in `block in convert_types'
from /usr/lib/ruby/vendor_ruby/dbi/row.rb:65:in `each'
from /usr/lib/ruby/vendor_ruby/dbi/row.rb:65:in `each_with_index'
from /usr/lib/ruby/vendor_ruby/dbi/row.rb:65:in `convert_types'
from /usr/lib/ruby/vendor_ruby/dbi/row.rb:75:in `set_values'
from /usr/lib/ruby/vendor_ruby/dbi/handles/statement.rb:226:in `fetch'
from /usr/lib/cgi-bin/test:39:in `block in <main>'
from /usr/lib/cgi-bin/test:36:in `each'
from /usr/lib/cgi-bin/test:36:in `<main>'

经过一些侦探工作,我发现它的日期为 0000-00-00,这是 fetch() 不喜欢的。未定义的日期是可以的,Perl 中的 DBI 可以处理所有零日期,这只是 Ruby 中的 DBI。

我可以修复数据库,并且我会尝试让将值写入数据库的应用程序也修复,但我认为我的 Ruby 应该能够适应此类情况。有没有办法解决这个问题,也许使用rescue以某种方式?

最佳答案

这是我想出的解决方案:

query = "select ETA from mydb.mytable where ID = #{someval}"
rows = dbh.execute(query)
begin
while row = rows.fetch() do
# Do some stuff
...
end
rescue Exception => e
puts "#{e}<br>\n"
retry
end

这工作得很好,就像重试正在启动一个新的 while 循环一样,行保持其状态,以便在下一条记录上恢复提取。

唯一的问题是不良记录很难识别。为了解决这个问题,我发出了更多没有违规字段的查询。我有点丑陋的解决方案:

results = Hash.new
hit_error = false

query = "select ETA,UNIQUE_ID from mydb.mytable where ID = #{someval}"
rows = dbh.execute(query)
begin
while row = rows.fetch() do
# Do some stuff
...
results[row[1]] = row[0]
end
rescue Exception => e
hit_error = true
retry
end
if hit_error
query = "select UNIQUE_ID from mydb.mytable where ID = #{someval}"
rows = dbh.execute(query)
while row = rows.fetch() do
id = row[0]
unless results.has_key?(id)
begin
query = "select ETA for mydb.mytable where UNIQUE_ID = #{id} limit 1"
error = dbh.execute(query)
error.fetch() # expect this to hit same error as before
puts "Unexpected success for UNIQUE_ID #{id}<br>\n"
rescue Exception => e
puts "#{e} at UNIQUE_ID #{id}<br>\n"
end
end
end
end

最后,我不确定使用 DBI/Ruby 的有效性如何,它似乎已被弃用。 MySQL/Ruby 也是如此。我也尝试过续集,但收效甚微。

关于mysql - Ruby DBI 获取无法处理 MySQL 中的全零日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719531/

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