Невозможно вывести таблицы MySQL, содержащие даты в Sequel.
Вопрос
Я пытаюсь использовать Sequel для доступа к базе данных MySQL в Ruby.Когда я пытаюсь получить доступ к таблице, содержащей столбец даты, я получаю сообщение об ошибке.Когда я обращаюсь к таблице без нее, она работает нормально.Что не так?
Пример кода:
require 'rubygems'
require 'sequel'
DB = Sequel.connect(:adapter=>'mysql', :host=>'localhost', :database=>'db', :user=>'user', :password=>'password')
event = DB[:table]
puts event.all
Ошибка:
/usr/lib/ruby/1.8/date.rb:956:in `new_by_frags': ArgumentError: invalid date (Sequel::InvalidValue)
Ошибка не отображается при доступе к таблице, в которой нет даты.Это работает на Debian.
Решение
У меня такая же проблема.Это было вызвано тем, что Sequel заблокировал нулевую дату MySQL «0000-00-00».Решение, которое я использовал, состояло в том, чтобы установить
Sequel::MySQL.convert_invalid_date_time = nil
(найдено здесь: http://groups.google.com/group/sequel-talk/browse_thread/thread/152a4131bd280966).
Если вы управляете БД, вы также можете запретить MySQL хранить нулевые даты, используя режим SQL NO_ZERO_DATE: http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_no_zero_date.
Другие советы
Берегись:
Sequel::MySQL.convert_invalid_date_time = nil
больше не работает, но я только что исправил эту же проблему, установив опцию для моего объекта БД:
DB = Sequel.connect("mysql://localhost/#{DB_NAME}")
DB.convert_invalid_date_time = nil
Надеюсь, это поможет кому-то еще!
Окончательное решение заключалось в переключении на использование драгоценного камня data_objects Ruby.Это позволило избежать проблем с использованием собственного драйвера C MySQL.
Код корректируется следующим образом:
require 'rubygems'
require 'sequel'
# connect to the db
DB = Sequel.connect('do:mysql://user:pass@localhost/database')
Возможно, это может вызвать проблемы с производительностью, но это выходит за рамки моей первоначальной проблемы.
Спасибо lexu за комментарий к исходному вопросу.