2011-05-04 35 views
1

當我插入在傳統的數據庫模式(通過DataMapper的)只是幾個字段的表,我發現了以下內容:Rails 3:DataObjects :: SQLError - 如何阻止這些在*警告*上產生錯誤?

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

我其實並沒有指定該字段的值,但底層數據庫模式(MySQL)沒有一個設置。這實際上並不會引起問題,它只是表示MySQL執行插入操作,但在完成後顯示「警告:1」。但是,這個警告是導致Rails停止並回滾插入的原因。我知道我可以修復這個領域,但有更多的人喜歡它,我正在尋找是否有辦法讓DataObjects冷靜下來,只有實際的SQL錯誤而不是警告的錯誤?

的Rails 3.0.7,1.9.2紅寶石,DataMapper的1.1.0

回答

4

對於不可避免的可憐的人誰也有解決這個問題...

的問題是,JDBC(這是什麼DataObjects包裝)調整MySQL變量sql_mode並將其設置爲TRADITIONAL,它將此行爲添加到MySQL。在使用DataMapper之前,只需要在應用程序中的任何位置撤消該操作(只需要執行一次)。

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

由於sql_mode可以是逗號分隔的模式的列表,最好你可能想要做的東西更聰明,只是從列表中剝離TRADITIONAL,但上面是一個快速和骯髒的解決方案。

更新:它不僅僅是導致它的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