1

私は Ruby 初心者で、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>'
4

1 に答える 1

3

バックトレースをもっと投稿できますか?を呼び出しているものを確認する必要がありますstring_to_datetime

また、特定のニーズがない限り、do/mysql アダプターを使用しないことをお勧めします。代わりに mysql または mysql2 アダプターを使用してください。エラーの原因が MySQL データベースの偽の日時である場合は、mysql2 アダプターを使用するか、mysql アダプターと set を使用することをお勧めしますDB.convert_invalid_date_time = nil

于 2012-12-17T23:20:57.080 に答える