Rails 3:DataObjects :: SQLError - 如何阻止它们在* warnings *上产生错误?

时间:2011-05-04 16:54:21

标签: ruby-on-rails ruby datamapper legacy-database

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

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