Daten aus externer DB in Drupal einlesen
am 19.05.2010 - 13:36 Uhr in
Hallo,
ich hoffe ich bin hier im korrekten Forum gelandet.
Bei uns in der Firma gibt es aktuell eine Arbeitszeitserfassung bzw. kleine Projektverwalung auf Basis von PHP und mysql. Da Sie langsam nicht mehr den Anforderungen entspricht, soll Sie neu entwickelt werden. Als Drupalfan habe ich vorgeschlagen, das Ganze in Drupal 6 umzusetzen. Schwupps war ich Projektverantwortlicher ;-)
Ich habe mir mittels CCK eine Struktur zusammengebastelt von der ich glaube, dass Sie die alten Zusammenhänge plus Mehrfunktion erfüllt. Nun stehe ich allerdings vor dem Problem, das die Daten der letzen 10 Jahre aus der alten DB in Drupal hinein müssen. Ausserdem muss soll die alte php maske so angepasst werden, das sie weiterhin auch ohne drupal auf die Elemente zugreifen kann.
Da ein DB import zu Nodes sicherlich nichts Neues ist habe ich hier im Forum geschaut aber noch nichts passendes gefunden. Per ggogle habe ich ein paar threads in englischsprachigen Foren gefunden. Eigentlich kein Problem, aber nach ein paar stunden dröhnt mir langsam der Schädel.
Hat jemand einen interessanten Lösungsvorschlag für mich ? Konkret suche ich eine Möglichkeit aus verschiedenen Tabellen einer bestehenden DB Daten in CCK-Nodes ähnlicher Form zu drücken. Optimal wäre es Beziehungen direkt als Nodereferences darzustellen.
Besten Dank,
Der Cutter
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich glaube das wird von
am 19.05.2010 - 14:53 Uhr
Ich glaube das wird von keinem Modul wirklich erschlagen.
Das Problem liegt darin, dass ein oder mehrere Content-Types mit wie auch immer verschachtelten CCK Feldern (direkte Eingabe oder node-references) gänzlich anders verwaltet wird wie eine relationale Datenbank.
Du hast ja meist innerhalb einer Tabelle eine Art automatischen Zähler, vielleicht eine ID, dann irgendwelche Felder.
In Drupal hingegen gibt es gänzlich andere Zähler, die zudem von Drupal selbst verwaltet werden. Eine Relation über IDs herzustellen, ist zwar sinnvoll, aber wie stellt man hier die Konsistenz der beiden Datenbanken her?
Du müsstest pro Tabelle der ursprünglichen DB einen Content Type in Drupal anlegen.
Dann wiederum aber gibt es den Bug (oder das nette Feature), dass die CCK - Feld-Inhalte nicht unbedingt innerhalb der content-type - Tabellen gespeichert werden. Kommt das Feld nur in einem Content Type vor, werden die Inhalte dort vorgehalten. Kommt ein Feld in mehreren Content-Types vor, wird für das Feld eine neue Tabelle angelegt, in der dann die Feldinhalte, verknüpft mit den nids und vids abgelegt sind.
Dadurch scheitern jegliche direkten Importe.
Man könnte nun natürlich schauen, ob man die Felder aus der alten DB ausliest und dann jeweils automatisiert über das normale "create content" in Drupal eingibt, aber hier kommt auch wieder das Problem der Reihenfolge zum Tragen. (Und so ein Modul müsste man auf jedenfall selber entwickeln...)
Du kannst eine nodereference nur dann auswählen, wenn du den entsprechenden Inhalt vorher eingegeben hast.
Was man vielleicht einfacher realisieren könnte:
Eine Schnittstelle (wohl selber programmiert) von Drupal auf die alte DB, um die alten Daten darzustellen. Die Eingabe von neuen Daten müsste dann über die Eingabemasken von Drupal geschehen.
Nichtsdestotrotz sehe ich keine Out-of-the-Box Lösung.
Die Frage, die sich mir allerdings ganz pragmatisch stellt: Wenn es eine Zeiterfassung ist, wofür braucht ihr die Daten der letzten 10 Jahre? Bei Projektdaten mag dies noch sinnvoll sein, aber Zeiterfassungsdaten?
Und: Wofür braucht ihr Drupal hierfür? Die Migration von anderen Datenbank nach Drupal ist beliebig komplex, in Drupal kann man die Daten nicht selber verwalten. Der einzige Vorteil wären die Views, die man sich anhand der Daten selber generieren kann.
Aber je nach Komplexität der Views wäre eine php-Implementierung dieser Views für das alte System ggf. noch eine sinnvollere Alternative.
Wir haben ein ähnliches Problem mit MS Access-Datenbanken bzw. Cobra und Drupal... - Von daher würden mich andere Ansätze und Lösungvorschläge zu dem o.g. Problem ebenfalls interessieren.
Datenimport aus externer DB?
am 19.05.2010 - 15:32 Uhr
Hallo,
erst einmal Danke für die zügige Antwort!
Die Frage, die sich mir allerdings ganz pragmatisch stellt: Wenn es eine Zeiterfassung ist, wofür braucht ihr die Daten der letzten 10 Jahre? Bei Projektdaten mag dies noch sinnvoll sein, aber Zeiterfassungsdaten?
Dies hängt unmittelbar zusammen: Zeiten werden Projekten zugeordnet, die wiederum Abgerechnet, erweitert, usw. werden müssen.
Views auf die alte DB ist leider auch keine Möglichkeit, da wie gesagt das DB-Modell so oder so aufgebohrt werden muss. Es soll eine Lösung aus "einem Guß" sein.
Da verschiedene Abteilungen, bzw Personen sehr verschiedene Projektsichten haben,wären die Views von Drupal eine tolle Sache. Desweiteren habe ich damit gleich eine Rechteverwaltung und komfortable Eingabemöglichkeiten für verschiedenste Datentypen.
An Drupal halte ich also fest ;-)
Ich bin gar nicht davon ausgegangen, das es dafür ein feriges Modul gibt, habe aber in anderen Foren Stichwörter wie node_save oder drupal_execute aufgeschnappt mit denen es anscheinend möglich ist Drupal dazuzubringen neue Nodes automatisiert anzulegen und bestimmte Verknüpfungen und Prüfungen von Drupal selbst durchführen zu lassen. Das Problem ist, dass sich Diskussionen in Foren oft verlaufen.Wenn man stundenlang in einem Bereich forstet, in dem fast jede Info eine Neue ist und zudem nicht in Muttersprache, platzt einem irgendwann der Kopf ;-)
Das mit den Relationen war nur ein dreister Zusatzwunsch, man weiß ja nie. :oD
Deshalb hoffe ich hier jemanden zu finden, der auf diesem oder anderem Wege bereits eine Lösung gebastelt hat von der ich profitieren kann.
Falls sich jemand angesprochen fühlt oder einen Verweis auf einen guten Artikel/Screencast/...hat: Bitte melden!
Besten Dank
Der Cutter
Frage:
am 19.05.2010 - 18:23 Uhr
Willst du aus genau einem Datensatz der alten Zeiterfassung einen neuen Node in Drupal erstellen ?
Wenn ja, würde ich die Daten sequenziell aus der alten DB auslesen und Nodes per "node_save" oder hook_insert (http://api.drupal.org/api/function/hook_insert/6)
Sepp
So ähnlich
am 20.05.2010 - 07:35 Uhr
Leider passen alte und neue Datensätze nicht 100% auf einander, deshalb werde ich mir wohl für jeden Neuen nodetype ein skrippt schreiben, das mir die entsprechenden Infos aus den alten Daten zusammenklaubt. Der Ansatz ist jedoch der Gleiche: Node für Node einfügen, was besseres fällt mir da nicht ein.
Viele Wege führen nach Rom - Die Frage ist: Welcher ist ein erfolgversprechender, von was sollte ich besser die Finger lassen? Möchte nicht viel Zeit in etwas investieren, was sich im nachhinein als schmutzig herausstellt oder das System im Nachinein irgendwelche Probleme hat.
Hat jemand mit node_save, hook_insert, drupal_execute, noch was anderes ... gearbeitet und kann mir sagen was am Besten funzt bzw. worauf man achten sollte?
Ursprünglich hatte ich vor, alles direkt per sql von DB zu DB zu exportieren, bin mir aber unsicher, ob ich evtl an irgendeiner Stelle etwas vergesse, bzw Drupal durcheinanderbringe wenn plötzlich nodes da sind die nicht selbst angelegt sind (vortlaufende Zählung, ect)
Deshalb suche ich jetzt nach dem elegantesten "Drupal way" dafür
Hat jemand Tipps für mich ?