Ruby Sequel gem:优雅地处理无效的日期值

Ruby Sequel gem:优雅地处理无效的日期值,ruby,sequel,Ruby,Sequel,我是ruby noob,我正在尝试使用Sequel和data_objects适配器处理一些博客文章: DB = Sequel.connect('do:mysql://user:pass@localhost/database') db[posts_query].each do |post| puts post end 但我得到了Sequel::InvalidValue异常,抱怨日期列: /usr/lib/ruby/1.9.1/time.rb:202:in `local': Argument

我是ruby noob,我正在尝试使用Sequel和data_objects适配器处理一些博客文章:

DB = Sequel.connect('do:mysql://user:pass@localhost/database')

db[posts_query].each do |post|
  puts post
end
但我得到了
Sequel::InvalidValue
异常,抱怨日期列:

/usr/lib/ruby/1.9.1/time.rb:202:in `local': ArgumentError: argument out of range (Sequel::InvalidValue)
    from /usr/lib/ruby/1.9.1/time.rb:202:in `make_time'
    from /usr/lib/ruby/1.9.1/time.rb:271:in `parse'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/core.rb:295:in `string_to_datetime'
我试图捕捉异常:

begin
  db[posts_query].each do |post|
      puts post
  end
rescue Sequel::InvalidValue => e
  puts e.inspect
end
但这并没有多大帮助

如何找出哪一行的值不正确

还有,有没有一种方法可以完成这个迭代,这样我就可以捕获异常,但继续循环剩余的行

更新:

我切换到mysql2适配器,现在我至少可以看到无效日期:

/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:154:in `each': Mysql2::Error: Invalid date: 2008-04-00 00:00:15 (Sequel::DatabaseError)
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:154:in `block in fetch_rows'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:89:in `_execute'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/shared/mysql_prepared_statements.rb:34:in `block in execute'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/database/connecting.rb:236:in `block in synchronize'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/connection_pool/threaded.rb:104:in `hold'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/database/connecting.rb:236:in `synchronize'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/shared/mysql_prepared_statements.rb:34:in `execute'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/dataset/actions.rb:778:in `execute'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:171:in `execute'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:140:in `fetch_rows'
    from /var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/dataset/actions.rb:154:in `each'
    from wordpress_importer.rb:112:in `process'
    from wordpress_importer.rb:308:in `<main>'
/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:154:“每个”:mysql2::错误:无效日期:2008-04-00:00:15(sequel::DatabaseError)
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:154:in'block in fetch_rows'
来自/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:89:in`_execute'
来自/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/shared/mysql\u prepared\u语句。rb:34:in`block in execute'
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/database/connecting.rb:236:在“同步中的块”中
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/connection\u pool/threaded.rb:104:in'hold'
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/database/connecting.rb:236:在“同步”中
来自/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/shared/mysql\u-prepared\u语句。rb:34:in'execute'
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/dataset/actions.rb:778:in'execute'
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:171:in'execute'
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/adapters/mysql2.rb:140:in'fetch_rows'
from/var/lib/gems/1.9.1/gems/sequel-3.42.0/lib/sequel/dataset/actions.rb:154:in'each'
来自wordpress_进口商。rb:112:正在“处理中”
来自wordpress\u进口商。rb:308:in`'

你能发布更多的回溯吗?您需要查看是什么在调用
string\u到\u datetime


另外,我建议不要使用do/mysql适配器,除非您有特殊需要。改用mysql或mysql2适配器。如果错误是由MySQL数据库中的假日期时间引起的,那么您可能需要使用mysql2适配器,或者使用mysql2适配器并设置
DB.convert\u invalid\u date\u time=nil

谢谢,切换到mysql2适配器很有帮助。添加了完整的backtrace.File,这是mysql2适配器的一个bug,因为它无法正确处理转换。为了解决这个问题,请使用带有“DB.convert\u invalid\u date\u time=nil”的mysql适配器。我使用Firefox和SqlItemManager插件编辑表和字段,直到不再出现任何错误为止,大约有四个问题。