2010-12-16 2 views
0

J'ai une base de données MySQL 5 mise à jour toutes les 5 minutes à partir d'une base de données propriétaire sur laquelle je n'ai aucun contrôle (en termes de programmation ou d'accès à la base de données). La base de données MySQL est un miroir de cette base de données propriétaire, et la base de données propriétaire est en charge de la procédure de mise à jour (ce qui signifie que je ne peux pas ajouter de hook lorsque le processus de mise à jour est appelé).PHP suivre les mises à jour récentes à la base de données MySQL pour pousser à l'application Rails?

J'ai une autre application Rails complètement séparée dont j'ai besoin pour importer des enregistrements de la base de données MySQL externe (l'application Rails est alimentée par PostgreSQL et elle est hébergée à distance). Donc, en pardonnant l'extrême inefficacité de cette configuration (c'est un système en transition), j'ai besoin de ceci: un script PHP qui peut soit interroger soit être appelé quand il y a une mise à jour de la base de données MySQL (que ce soit cette mise à jour consiste à mettre à jour des informations sur un enregistrement, un nouvel enregistrement créé ou un enregistrement existant supprimé, etc.), puis à transmettre ces informations (en JSON) via la requête POST à ​​l'application Rails. J'ai déjà écrit un script PHP qui peut extraire les données de MySQL et les analyser pour mon application Rails, mais je ne sais pas comment (a) faire en sorte que le script soit appelé ou appelé mise à jour est faite, ou (b) comment lui dire de ne trouver que les changements les plus récents (depuis sa dernière interrogation, en gardant à l'esprit que plus d'un enregistrement peut avoir été modifié/créé/supprimé).

Quelqu'un peut-il donner des conseils à ce sujet? Comme une question corollaire


, si quelqu'un sait comment sauter PHP et faire la même procédure directement de Rails à une base de données MySQL externe, je (évidemment) préfère cette méthode. Dans l'intérêt d'obtenir au moins une solution réalisable, cependant, j'accepterai volontiers une solution Rails ou PHP.

Répondre

0

est ici une approche qui fait tout dans Rails:

Mettre en place une tâche cron qui se déclenche toutes les cinq minutes. Il exécute une tâche rake ou boucle une certaine URL dans votre application Rails (idéalement y compris un jeton de sécurité, juste pour faire bonne mesure). Je préfère ce dernier - c'est plus simple et ne démarre pas un nouveau processus.

L'action déclenchée par le travail cron peut regarder la colonne created_at dans chaque table et déterminer ce qui pourrait être nouveau. Pour les enregistrements potentiellement nouveaux - comme déterminé par created_at - vérifiez s'ils sont réellement nouveaux, et s'ils le sont, écrivez-les dans votre base de données PostgreSQL. Il y a deux façons de vérifier si les dossiers sont nouveaux:

  1. Si les clés primaires correspondent toujours entre MySQL et PostgreSQL, vous pouvez juste essayer de sauvegarder l'enregistrement, définissant explicitement la clé primaire. Si l'enregistrement a déjà été enregistré, vous obtiendrez une exception, que vous pourrez ensuite récupérer.

  2. Si les clés ne sont pas garanties, vous pouvez comparer avec d'autres valeurs uniques. Ou, s'il n'y a pas de valeur unique que vous pouvez utiliser, vous pouvez avoir une table séparée qui vous indique quels enregistrements ont été copiés. Les anciens enregistrements de cette table pourraient être effacés périodiquement, afin de ne pas gaspiller beaucoup d'espace.

Faites tout cela dans les modèles, pas le contrôleur, bien sûr. Si vous n'avez pas de colonnes created_at, ajoutez-les et assurez-vous qu'elles sont écrites lors de vos mises à jour périodiques, probablement en définissant des valeurs par défaut dans MySQL.

Obtenir votre application Rails pour se connecter à la base de données MySQL ne devrait pas être trop difficile.Voici quelques informations à ce sujet:

http://pullmonkey.com/2008/4/21/ruby-on-rails-multiple-database-connections/

Questions connexes