1

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

4

1 回答 1

4

对于不可避免的可怜的灵魂,他们也必须解决这个问题......

问题是 JDBC(这是 DataObjects 包装的)调整 MySQL 变量sql_mode并将其设置为TRADITIONAL,从而将此行为添加到 MySQL。在使用 DataMapper 之前,您只需在应用程序的任何位置撤消该操作(只需执行一次)。

repository(:default).adapter.execute("SET sql_mode = ''")

由于sql_mode可以是逗号分隔的模式列表,理想情况下,您可能想做一些更聪明的事情来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
于 2011-05-05T02:01:17.457 回答