[SQLAlchemy] vorhandene Tabelle ”erweitern”

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
BlackJack

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:

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)
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. :-(
Benutzeravatar
Balmung
User
Beiträge: 44
Registriert: Sonntag 17. März 2013, 18:36

Ein Trigger auf Datenbankebene (sofern unterstützt) wäre vielleicht die elegantere Methode.
»Honk Honk«
BlackJack

@Balmung: Würde voraussetzen das man das mit der jerweiligen Datenbanksoftware machen kann. Der Grund für SQLAlchemy ist unter anderem unabhängig von konkreten DBMS zu sein. Lösungen sollten mindestens mit MySQL, PostgreSQL, und SQLite3 laufen.
Antworten