Rails 3: DataObjects :: SQLError - Как мне остановить их от появления ошибок в * warnings *? - PullRequest
1 голос
/ 04 мая 2011

Когда я вставляю несколько таблиц в таблицу в устаревшей схеме базы данных (через DataMapper), я получаю следующее:

DataObjects::SQLError "Field 'activationcode' doesn't have a default value"

На самом деле я не указывал значение для этого поля, но базовая схема БД (MySQL) также не имеет ни одного набора. Это на самом деле не вызывает проблемы, это просто означает, что MySQL выполняет вставку, но показывает «Warnings: 1» после того, как это сделано. Это предупреждение заставляет Rails останавливаться и откатывать вставку. Я знаю, что могу исправить это поле, но есть еще тысячи подобных, и я пытаюсь выяснить, есть ли способ заставить DataObjects просто охлаждать и обрабатывать только ошибки на реальных ошибках SQL, а не на предупреждениях?

Rails 3.0.7, Ruby 1.9.2, DataMapper 1.1.0

1 Ответ

4 голосов
/ 05 мая 2011

Для неизбежной бедной души, которая также должна обойти эту проблему ...

Проблема в том, что JDBC (именно это переносит DataObjects) настраивает переменную MySQL sql_mode и устанавливает ее на TRADITIONAL, который добавляет это поведение в MySQL.Вам просто нужно отменить это в любом месте вашего приложения, прежде чем использовать DataMapper (нужно сделать только один раз).

repository(:default).adapter.execute("SET sql_mode = ''")

Так как sql_mode может быть списком режимов, разделенных запятыми, в идеале вы, вероятно, захотитесделайте что-нибудь умнее, чтобы просто убрать TRADITIONAL из списка, но приведенное выше решение является быстрым и грязным.

ОБНОВЛЕНИЕ: это вызывает не только ТРАДИЦИОННЫЙ флаг.Это TRADITIONAL, STRICT_ALL_TABLES и STRICT_TRANS_TABLES.Я проверил, что JDBC настроил и устранил проблемные режимы методом проб и ошибок.Результирующий список, который не создает поведение WARNING = ERROR:

REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_UNSIGNED_SUBTRACTION,NO_DIR_IN_CREATE,ANSI,NO_BACKSLASH_ESCAPES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...