2009-08-15 10 views
1

Ich habe eine Rails-Anwendung, die MySQL verwendet. Die Anwendung muss SQLite-Datenbanken füllen, die von der Master-MySQL-Datenbank an Client-Anwendungen verteilt werden sollen. Das Schema für die SQLite-Datenbank ist der MySQL-Datenbank sehr ähnlich, aber nicht identisch. Die SQLite-Datenbanken werden mit einer Teilmenge des Schemas und der Daten gefüllt, die in der Master-MySQL-Datenbank gespeichert sind. Die Datenteilmenge wird durch Parameter bestimmt, die in der http-Anfrage übergeben werden. Dies ist nicht als eine Wartungsoperation gedacht, sondern als eine Lieferung einer Untermenge der MySQL-Datenbank an Clientanwendungen als eine SQLite-Datenbank.Alle Vorschläge für eine Ruby-Lösung zum Füllen einer SQLite-Datenbank von einer MySQL-Quelle

Ich überlegte, ob ich versuchen könnte, taps zu modifizieren oder eine Metal-App mit sequel zu schreiben, um beide Datenbanken zu verbinden, um die Daten zu übertragen.

Alle anderen Vorschläge würden geschätzt werden?

Antwort

2

Haftungsausschluss: Ich bin der Sequel Maintainer.

Sequel wäre wahrscheinlich der einfachste Weg, dies zu tun. Das Bin/Sequel-Tool kann eine MySQL-Datenbank in eine SQLite-Datenbank kopieren. Wenn Sie sich den Quellcode dazu ansehen (http://github.com/jeremyevans/sequel/blob/205d8a04842c143736de76d645a2a955a1ca641f/bin/sequel), können Sie sich eine Vorstellung davon machen, wie Sie dies mit Sequel tun können.

Aufgrund der Art, wie Dinge konstruiert werden, ist es wahrscheinlich am einfachsten, das Schema direkt zu kopieren und dann nicht benötigte Spalten zu löschen. Alternativ würde ich einfach den Code schreiben, um das gewünschte SQLite-Datenbankschema zu erstellen.

Der Code zum Kopieren der Daten kann wahrscheinlich eine modifizierte Version dessen verwenden, was in bin/sequel ist.

+0

Das ist sehr hilfreich. Vielen Dank. Ich glaube, ich werde den Weg der Verwendung eines Rails Metal mit Sequel gehen, um mein Ziel zu erreichen. –

0

Erstellt Ihre Rails-App die sqlite db auf Abruf für einen Client oder ist dieser Prozess ein Out-of-Band-Wartungsauftrag?

Wenn es ein Wartungsauftrag ist, würde ich ein Shellskript schreiben, um die mysql db auszugeben, irgendwelche Ersetzungen auf dem Dump durchzuführen, um es sqlite-spezifisch zu machen, und schließlich das in eine SQLite db zu importieren.

+0

Ich versuche, die SQLite-Datenbank bei Bedarf für Client-Anwendungen erstellt zu haben. Das Generieren der SQLite-Datenbank von der Master-MySQL-Datenbank wird eine häufige Anforderung an den Server sein. –

0

Vielleicht könnten Sie die yaml_db plugin versuchen, weil es ein Rake-Task verwendet könnten Sie einen cron hinzufügen, die dies taten:

rake db:data:dump RAILS_ENV=production && rake db:data:load RAILS_ENV=lite 

die ‚Lite‘ Umgebung einrichten, die die sqlite db verwendet.

Ich geuss auch wenn du ein paar Änderungen an den Daten vornehmen willst, könntest du das Plugin ein wenig modifizieren.

+0

Vielen Dank für den Vorschlag.Ich bin mir nicht sicher, ob dies mit meiner Anforderung funktionieren würde, in der Lage zu sein, die sqlite db per HTTP-Anfrage zu füllen. Eine andere Sache, die ich vielleicht nicht erwähnt habe, ist, dass die generierte db spezifisch für Parameter generiert wird, die die http-Anfrage durchlaufen. –

1

Wenn Sie an einem ähnlichen Modell in beiden Datenbanken arbeiten, sollten Sie bemerken, dass die Methode "attributes" von ActiveResource einen Hash der Attribute dieses Modells zurückgibt und "attributes =" einen Attribut-Hash erhält (muss nicht) alle Attribute des Modells einschließen). Wenn Sie das im Hinterkopf behalten, können Sie die ActiveRecord :: Base.establish_connection-Methode nutzen, um beide Modelle mit den verschiedenen Datenbanken verbinden zu lassen. So können Sie so etwas wie tun könnten:

MysqlModel.establish_connection(YAML.load_file(path_to_database_yml)) 
SqliteMode.establish_connection(YAML.load_file(path_to_other_database_yml)) 

MysqlModel.all.each do |m| 
    SqliteModel.create(m.attributes) 
end 

Wenn die Modelle, nicht alle Felder teilen oder eine Verarbeitung benötigen, bevor es das SQLite-Modell zuordnen, können Sie eine Methode erstellen, die die ursprünglichen empfangen Attribute Hash und Prozess Es gibt den richtigen Attribut-Hash für das SQLite-Modell zurück.

+0

Danke. Ich werde etwas ähnliches tun, aber ich denke eher mit Sequel als ActiveRecord. –

Verwandte Themen