[SQLAlchemy] vorhandene Tabelle ”erweitern”
Verfasst: Freitag 13. Juni 2014, 15:42
Wie könnte man folgendes Szenario am besten Umsetzen:
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:
Mal davon abgesehen dass es nervig ist für jedes Attribut ein Property zu schreiben, muss man auch daran denken irgendwo neu erstellte `_my_user` zur Session hinzuzufügen, damit die auch tatsächlich gespeichert werden. Was natürlich mega-hässlich ist.
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.
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.
