当我(通过 DataMapper)向遗留数据库模式中的表插入几个字段时,我得到以下信息:
DataObjects::SQLError "Field 'activationcode' doesn't have a default value"
我实际上并没有为那个字段指定一个值,但是底层的数据库模式 (MySQL) 也没有一个集合。这实际上不会导致问题,它只是意味着 MySQL 执行插入但在完成后显示“警告:1”。但是,该警告是导致 Rails 停止运行并回滚插入内容的原因。我知道我可以修复这个字段,但还有成千上万个类似的字段,我想知道是否有办法让 DataObjects 冷静下来,只在实际 SQL 错误上出错,而不是在警告上出错?
Rails 3.0.7、Ruby 1.9.2、DataMapper 1.1.0
最佳答案
对于不可避免的可怜的灵魂,他们也必须解决这个问题......
问题是 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
关于ruby-on-rails - Rails 3:DataObjects::SQLError——我如何阻止它们在 *warnings* 上产生错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887019/