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

标签 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

最佳答案

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

问题是 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

关于ruby-on-rails - Rails 3:DataObjects::SQLError——我如何阻止它们在 *warnings* 上产生错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887019/

相关文章:

datamapper - 数据映射器模式

ruby-on-rails - collection_check_boxes 未定义方法 `id' for { :id=>1, ...} in Hash

ruby - 在 RSpec 中捕获 STDOUT

ruby - 与 Google-API-Client 一起使用时,DataMapper 需要可寻址错误

ruby - 向继承自 Hash 的 Ruby 类添加类似 'each' 的方法

ruby - 让 VCR 跳过 URI :

ruby - 使用 sinatra,我如何从 3 个单独的输入框构造一个正确的 DateTime 值?

ruby-on-rails - 如何将 before_action 与 :unless and params 一起使用

mysql - 如何将 ruby​​ on Rails 应用程序导入到另一台计算机

ruby-on-rails - Prawn :目录如何做成 “Leader dots”?