当我只在遗留数据库模式中的表中插入几个字段时(通过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
答案 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