Alle Tutorials und Referenzen, die ich über Persistent finden konnte, beschreiben sehr detailliert, wie Persistent automatisch einen neuen Datentyp, ein neues Schema, eine neue Migration usw. aus einer einzigen Definition in seiner DSL erstellen kann. Ich konnte jedoch keine Erklärung finden, wie Persistent mit bereits vorhandenen Datentypen umgehen kann.
Ein Beispiel: Angenommen, ich habe bereits ein Haskell-Modul für eine Spiellogik. Es enthält einen Aufnahmetyp für einen Spieler. (Es soll durch Linsen verwendet werden, daher die Unterstriche.)
%Vor%Frage: Was ist der kanonische Weg, einen solchen Typ in einer Datenbank mit Persistent zu speichern? Gibt es eine Klasse, die ich implementieren kann? Oder sollte ich am besten einen neuen Typ durch Persistent definieren, z. B.
%Vor%und dann manuell zwischen diesen Typen zuordnen?
%Vor% Meine Lösung für dieses Problem bestand darin, einen neuen Typ über Yesods mkPersist
hinzuzufügen und manuell zwischen diesen zu marshallen.
config/models
:
Marshalling.hs
:
Ein möglicher Vorteil ist, dass Sie Felder in Ihrer Tabelle haben können, die im internen Datensatz nicht benötigt werden. In meinem Beispiel war es nützlich, ein Erstellungsdatum an den Player anzuhängen. Dies wurde jedoch nur in der Web-Interface-Ebene verwendet. Es wurde nie in der internen Spiellogik verwendet, die den Player
-Typ definiert hat. Aufgrund des manuellen Marshalling konnte ich dieses Feld trotzdem zur selben Datenbanktabelle hinzufügen.
Von: Ссылка
%Vor% Die derivePersistField
-Funktion ist die Vorlage, die Haskell-Magie, die es funktioniert.
Beachten Sie, dass Sie das derivePersistField
-Thing in einer separaten Datei zu dem mkPersist
machen müssen, um einen TH-Phasenfehler zu vermeiden.
Tags und Links haskell persistent yesod