Angenommen ich habe eine vorhandene Tabelle die von einer anderen Software erstellt und befüllt wird, zum Beispiel `user (id, name)` und ich kann/darf diese Tabelle nicht ändern. Nun möchte ich aber gerne diese Benutzer in meiner Anwendung verwenden und zusätzliche Informationen in einer weiteren Tabelle verwalten, zum Beispiel `my_user (id, user_id, age)` mit `user_id` als Fremdschlüssel in die `user`-Tabelle. Dazu hätte ich gerne ein ORM-Objekt `MyUser` das die Daten aus beiden Tabellen verwendet, und jetzt kommt der Knackpunkt: Bei Bedarf neue `my_user`-Datensätze anlegt wenn eine Abfrage `user`-Daten enthält für die es noch keine `my_user`-Daten gibt. Weil die externe Anwendung jederzeit neue `User`-Datensätze anlegen kann. Damit möchte ich halt gerne möglichst transparent mit umgehen können.
In einer ähnlichen Situation hatte ich mal Komposition verwendet, in einem ``@reconstructor`` das Attribut bei Bedarf angelegt, und dann alle Attribute per Porperties weitergeleitet. Also ungefähr so etwas hier:
Code: Alles auswählen
class User(Base):
__tablename__ = 'user'
id = Column(INT, primary_key=True)
name = Column(TEXT)
_my_user = relation('MyUser', uselist=False, lazy='joined')
@reconstructor
def _init(self):
if self._my_user is None:
self._my_user = MyUser(user_id=self.id)
@property
def age(self):
return self._my_user.age
@age.setter
def age(self):
self._my_user.age = age
class MyUser(Base):
__tablename__ = 'my_user'
id = Column(INT, primary_key=True)
user_id = Column(ForeignKey(User.id))
age = Column(INT)
Ich hätte eigentlich gedacht das wäre ein häufiger Anwendungsfall, aber entweder bin ich der einzige, oder ich stelle mich zu blöd mit Suchbegriffen an.