如何妥善处理“Mysql2 ::错误:无效日期”中的ActiveRecord?(How to gra

2019-09-02 01:24发布

我建立在旧的数据库也具有不同表中某些打破纪录一个Rails 3.2的应用程序。 其中给予最头疼的问题是,它包含无效的日期。

我设置我手动固定一个时间,让我的代码工作的沙箱。 现在是时候进行部署。 为此,沙箱是每天晚上复位和实时数据库复制,深挖重建索引和迁移都重新申请。 我们将部署到沙盒往往在最后的修复部署到现场安装之前获得。

由于传统的PHP应用程序和新的Rails应用程序需要在几个星期并行运行到几个月,我们不能简单地一次性固定的日期( 更新:只是为了澄清,这意味着他们在同一个数据库同时运行时间)。 我需要一种方法来自动完成这个,可能与迁移或耙任务(我会去为后者)。

但问题是:ActiveRecord的电抗器上加载这些记录,所以我没有办法调查记录,并通过在Ruby代码做了一些硬编码假设固定的日期。

第二个问题是,传统的数据库有不一致之处,因为PHP代码没有使用事务和一些代码路径断了,留下孤儿和破表约束后面。 因为它们发生,其中大多数是在模型已经照顾我会处理这一点。 第一个问题去与日期。

你怎么通常会解决这个问题? 也许甚至还有一些神奇的宝石在那里,它支持通过拦截异常和运行一些尝试,以修复代码迁移与破纪录遗留数据库...

迁移路径使用MySQL,和三个生产环境(现场数据库稳定,具有相同的数据库,并与数据库克隆沙上演,每天晚上复位)。 我们决定不这样做一次性的数据映射/迁移,因为我们不能一步到位更换整个遗留应用程序(它由CMS的约50000篇,数以百计的主题,用图片和下载大文件的数据库,支持约10个网站,约12年的数据和工作,从不同的编程技巧凌乱的PHP代码,重复的代码从不同的迁移阶段,从合作伙伴网站的RSS内容拉动从那里混的文章/文章到我们自己的应用程序的主题文章时间表,以及更有趣的东西...

第一步是迁移后端应用程序,以获得一致的管理和发布接口。 遗留在前端应用仍然需要写入数据库(评论和游客创造其他内容)。 所以固定数据库的过程中必须能够定期自动运行。

我们已经到位修补程序妥善处理在belongs_to的和的has_many破碎模型的依赖性。 回形针一体化的设计与所有发明了神奇的文件名映射工作。 和空气制动宝石报告所有应用程序崩溃对我们的管理平台安装,所以我们得到所有左怪癖的简要概述。

在旧的应用程序已经被修改了最新的MySQL版本的工作,并已迁移到当前的MySQL数据库服务器。

Answer 1:

我有同样的问题。 解决的办法是告诉mysql2不进行铸造,就像这样:

client.query(sql, cast: false).each do |row|
  row['some_date'] = Date.parse(row['some_date']) rescue(nil)
end

见mysql2文档的关于如何建立客户对象的详细信息。 如果需要的话,接入轨道DB配置通过ActiveRecord::Base.configurations



Answer 2:

创建一个数据导入rake任务,做所有的转换和修复需要(包括数据分析和固定),和每一个你从继承应用程序新的更新时间运行它。 该任务可以使用原始SQL(查找“执行”和“exec_query”的方法),它没有与模特工作。 这将是你神奇的“宝石”,你所期待的。 很显然,你不能有一个一劳永逸的为工具,破损数据的每一个案件都是独一无二的。 但就是不以新的代码库创建组装机。



Answer 3:

类似: Rails的:如何处理现有的无效日期的数据库? 也没有正确的答案,所以我下面转贴我的解决方案。

我觉得这对我的工作最简单的办法是database.yml文件写入设置:假的 ,例如,用于发展节

development
  <<: *default
  adapter: mysql2    
  (... some other settings ...)
  cast: false


Answer 4:

我相信它会解决你的问题Date.parse()

例如Date.parse(foo.created_at)



文章来源: How to gracefully handle “Mysql2::Error: Invalid date” in ActiveRecord?