Rails 3: DataObjects::SQLError—我如何阻止这些在“警告”上产生错误?



当我在遗留数据库模式(通过DataMapper)中向表插入几个字段时,我得到以下内容:

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

我实际上并没有为这个字段指定一个值,但是底层的DB模式(MySQL)也没有一个值。这实际上不会导致问题,它只是意味着MySQL执行插入,但在完成后显示"警告:1"。然而,正是这个警告导致Rails突然停止并回滚插入。我知道我可以修复这个字段,但有成千上万的像它,我正在寻找找出是否有一种方法,让数据对象只是冷静下来,只有错误在实际的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,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

相关内容

  • 没有找到相关文章

最新更新