当我在遗留数据库模式(通过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