1

(DataMapper を介して) 従来のデータベース スキーマのテーブルにいくつかのフィールドを挿入すると、次のようになります。

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

実際にはそのフィールドの値を指定しませんでしたが、基礎となる DB スキーマ (MySQL) にも値が設定されていません。これは実際に問題を引き起こすわけではなく、MySQL が挿入を実行することを意味しますが、完了後に「警告: 1」が表示されます。ただし、この警告が原因で Rails が停止し、挿入がロールバックされます。私はこのフィールドを修正できることを知っていますが、それに似たものが何千もあるので、警告ではなく実際の SQL エラーでのみ DataObjects を冷やしてエラーにする方法があるかどうかを調べていますか?

レール 3.0.7、ルビー 1.9.2、データマッパー 1.1.0

4

1 に答える 1

4

この問題を回避しなければならない避けられない貧しい魂のために...

問題は、JDBC(DataObjectsがラップするもの)がMySQL変数sql_modeを調整し、それをに設定することTRADITIONALです。これにより、この動作がMySQLに追加されます。DataMapperを使用する前に、アプリケーションの任意の場所でそれを元に戻す必要があります(1回だけ実行する必要があります)。

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
于 2011-05-05T02:01:17.457 に答える