Angenommen, ich habe eine Reihe von Benutzern, eine Reihe von Spielen, und ich verfolgen, ob ein Benutzer ein Spiel in einer separaten Tabelle beendet hat (Name: 'game_progress'). Ich möchte, dass, wann immer ein Benutzer erstellt wird, die Tabelle "game_progress" automatisch mit ihrer ID und einem "Nein" gegen alle verfügbaren Spiele gefüllt wird. (Ich weiß, dass ich warten kann, bis sie ein Spiel startet, um die Platte zu erstellen, aber ich brauche das für einen ganz anderen Zweck.) Wie würde ich das machen?Benutzerdefinierte Operationen beim Erstellen eines SQLAlchemy-Objekts
Ich versuchte mit dem Ereignis after_insert(). Aber, dann kann ich die ID des Benutzers, die in "game_progress" eingefügt werden soll, nicht abrufen. Ich möchte after_flush nicht verwenden (auch wenn ich herausfinden kann, wie es geht), weil es vielleicht ein bisschen Overkill ist, da die Benutzererstellungsoperation nicht so häufig vorkommt.
class Game(db.Model):
__tablename__ = 'games'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(30))
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(30))
class GameProgress(db.Model):
__tablename__ = 'game_progress'
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
game_id = db.Column(db.Integer, db.ForeignKey('games.id'), primary_key=True)
game_finished = db.Column(db.Boolean)
@event.listens_for(User, "after_insert")
def after_insert(mapper, connection, target):
progress_table = GameProgress.__table__
user_id = target.id
connection.execute(
progress_table.insert().\
values(user_id=user_id, game_id=1, game_finished=0)
)
db.create_all()
game = Game(name='Solitaire')
db.session.add(game)
db.session.commit()
user = User(name='Alice')
db.session.add(user)
db.session.commit()
Normalerweise würden Sie DB-Trigger für solche verwenden, oder einfach die Erstellung der erforderlichen zusätzlichen Daten in Ihre Logik des Erstellens eines neuen Benutzers einschließen, was bedeutet, dass Sie eine Funktion schreiben, die das Erstellen von Benutzern handhabt. –