SQLAlchemy - viele zu viele mit extra Spalte - wie?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
graceflotte
User
Beiträge: 25
Registriert: Samstag 8. März 2014, 12:17

Moin Miteinander,

ich würde gern eine kleine Website machen, auf der Leute Wetten abgeben können.
Doch seit gestern hänge ich an einem Problem mit SQLAlchemy fest.
Ich habe drei Tabellen:

Player
---
ID, Name

Game
---
ID, Name, Datum, Ergebnis

Player_Game
---
ID_Player, ID_Game, Vote

Ich bin neu im Umgang mit SQLAlchemy und hoffe hier habt ne Idee wie ich auf die "Votes" zugreifen kann.

Code: Alles auswählen

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@192.168.1.24/wetten'
db = SQLAlchemy(app)

PlayerGame = db.Table('player_game', db.Model.metadata,
                      db.Column('player_id', db.Integer, db.ForeignKey('player.id')),
                      db.Column('game_id', db.Integer, db.ForeignKey('game.id')),
                      db.Column('vote', db.Integer),
                      )

class Player(db.Model):
    __tablename__ = 'player'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True)
    count_wins = db.Column(db.Integer)

    def __init__(self, username):
        self.username = username

class Game(db.Model):
    __tablename__ = 'game'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    date = db.Column(db.String(32))
    result = db.Column(db.Integer)

    players = db.relationship('Player', secondary=PlayerGame)

    def __init__(self, name, date):
        self.name = name
        self.date = date

gamelist = Game.query.all()
for g in gamelist:
    print('----')
    print(g.name)
    for p in g.players:
        print(p.username)
        print(p.vote) # <-- AttributeError: 'Player' object has no attribute 'vote'

BlackJack

@graceflotte: `PlayerGame` sollte vielleicht besser `Vote` heissen und nicht als ”versteckte” Verbindungstabelle modelliert werden, sondern als ORM-Klasse. Wie willst Du sonst an die Attribute kommen?
graceflotte
User
Beiträge: 25
Registriert: Samstag 8. März 2014, 12:17

BlackJack hat geschrieben:@graceflotte: `PlayerGame` sollte vielleicht besser `Vote` heissen und nicht als ”versteckte” Verbindungstabelle modelliert werden, sondern als ORM-Klasse. Wie willst Du sonst an die Attribute kommen?
ok. Den Gedanken hatte ich ebenfalls schon. Nur dann scheitert es immer an der Umsetzung. Wie muss die Klasse aussehen?
Die letzten Zeilen in der Vote-Klasse führen bei mir nur zur Verwirrung. Wie füge ich dort jetzt die Player_ID und Game_ID hinzu?

Code: Alles auswählen

# [...]
class Game(db.Model):
    __tablename__ = 'game'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    date = db.Column(db.String(32))
    result = db.Column(db.Integer)

    players = db.relationship('Player', secondary=Vote)

    def __init__(self, name, date):
        self.name = name
        self.date = date

class Vote(db.Model):
    __tablename__ = 'votes'
    id = db.Column(db.Integer, primary_key=True)
    player_id = db.Column(db.Integer, db.ForeignKey('player.id'))
    game_id = db.Column(db.Integer, db.ForeignKey('game.id'))
    vote = db.Column(db.Integer)
    
    player = db.relationship('Player', backref='membership') # ??
    game = db.relationship('Game', backref='membership') # ??
# [...]

gamelist = Game.query.all() # AttributeError: 'Vote' object has no attribute 'foreign_keys'
print(gamelist)
Antworten