我有一个MySQL 5数据库,每5分钟从一个我无法控制的专有数据库(在编程或数据库访问方面)更新。 MySQL数据库是这个专有数据库的镜像,专有数据库负责更新过程(意思是,在调用更新过程时我无法添加钩子)。
我有另一个完全独立的Rails应用程序,我需要从外部MySQL数据库导入记录(Rails应用程序由PostgreSQL提供支持,并且远程托管)。
所以...赦免这个设置的极端低效率(这是一个转换中的系统),我需要的是:一个PHP脚本,无论何时对MySQL数据库进行更新,都可以轮询或调用(无论是update正在更新记录,创建的新记录或删除的现有记录等信息,然后通过POST请求将该信息(以JSON格式)推送到Rails应用程序。
我已经编写了一个PHP脚本,可以从MySQL中提取数据并为我的Rails应用程序解析它,但我不知道的是如何(a)让脚本轮询或在更新时调用或者(b)如何告诉它只查找最近的更改(因为它上次轮询,请记住,可能已经更改/创建/删除了多个记录)。
有人可以就此提出建议吗?
作为一个推论问题,如果有人知道如何跳过PHP并直接从Rails到外部MySQL数据库执行相同的过程,我(显然)更喜欢这种方法。但是,为了获得至少一个可行的解决方案,我很乐意接受Rails或PHP解决方案。
答案 0 :(得分:0)
这是一种在Rails中完成所有工作的方法:
设置一个每五分钟触发一次的cron作业。它要么运行rake任务,要么在你的Rails应用程序中卷曲某个URL(理想情况下包括一个安全令牌,只是为了好的措施)。我更喜欢后者 - 它更简单,不会启动新流程。
由cron作业触发的操作可以查看每个表中的created_at列,并确定可能是新的。对于可能的新记录 - 由created_at确定 - 检查它们是否真的是新的,如果是,则将它们写入PostgreSQL DB。有两种方法可以检查记录是否是新记录:
如果主键始终在MySQL和PostgreSQL之间匹配,您可以尝试保存记录,明确设置主键。如果记录已经保存,您将获得一个异常,然后您可以捕获该异常。
如果无法保证匹配,您可以检查其他一些唯一值。或者,如果您没有可以使用的唯一值,则可以使用单独的表来告诉您已复制了哪些记录。该表中的旧记录可以定期清除,因此不会浪费太多空间。
当然,在模型中完成所有这些,而不是控制器。如果您没有created_at列,请添加它们,并确保在定期更新发生时写入它们,最有可能是通过在MySQL中设置默认值。
让你的Rails应用程序连接到MySQL数据库应该不会太难。以下是一些信息:
http://pullmonkey.com/2008/4/21/ruby-on-rails-multiple-database-connections/