我用sqlalchemy和mysql设置了烧瓶。一切正常,但我仍然很困惑如何访问/使用我的关联表为我的多对多关系。我已经查看了文档,我非常确定我正确设置但不确定如何创建填写联结(关联)表的记录。
我有多对多的关系 -
users <--> teams
users <--> players
我也有一对一的关系,我正在使用而没有问题 -
users --> positions_bb
下面是我的models.py文件。我正在从python CLI进行所有测试(从图片中取出其余的烧瓶框架)。创建用户后,如何在teams_users_map表中创建一个显示user_id键和team_id键的条目?我试过了:
t = models.Team(teamname='exteam')
u = models.User(email='bob@emailcom','password123')
t.user = 1 ('incompatible collection type: int is not list like'). Ok this makes sense - a list is expected.
t.user = [User(1)] - ('User is not defined'). This was just a guess at some examples I saw, didn't make sense to me anyway.
t.users = 1 - this actually did not return an error but it also didn't appear to save anything in the database.
简而言之,我猜是非常愚蠢的问题 - 如何将项目添加到联结表中?
from werkzeug import generate_password_hash, check_password_hash
from datetime import datetime,timedelta
from ylm import db
teams_users_map = db.Table('teams_users_map',
db.Column('fk_team_id', db.Integer, db.ForeignKey('teams.team_id')),
db.Column('fk_user_id', db.Integer, db.ForeignKey('users.user_id'))
)
teams_players_map = db.Table('teams_players_map',
db.Column('fk_team_id', db.Integer, db.ForeignKey('teams.team_id')),
db.Column('fk_player_id', db.Integer, db.ForeignKey('players.player_id'))
)
class User(db.Model):
__tablename__ = 'users'
user_id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(120))
pwdhash = db.Column(db.String(200))
create_date = db.Column(db.Date)
active = db.Column(db.Integer)
def __repr__(self):
return 'UserID: %r\nEmail: %r\nPassword %r\nCreate Date: %r\nActive: %r\n\n' % (self.user_id,self.email,self.pwdhash,self.create_date,self.active)
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return unicode(self.user_id)
def __init__(self, email, password):
self.email = email.lower()
self.set_password(password)
self.create_date = datetime.utcnow()
self.active = 0
def set_password(self, password):
self.pwdhash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.pwdhash, password)
class Team(db.Model):
__tablename__ = 'teams'
team_id = db.Column(db.Integer, primary_key=True)
teamname = db.Column(db.String(96), unique=True, nullable=False)
sport = db.Column(db.String(32))
age = db.Column(db.Integer())
create_date = db.Column(db.Date)
active = db.Column(db.Integer)
user = db.relationship('User', secondary=teams_users_map, backref='teams')
player = db.relationship('Player', secondary=teams_players_map, backref='teams')
def __repr__(self):
return "TeamID: %r\nTeamName: %r\nSport: %r\nAge: %r\nCreate Date: %r\nActive: %r\n\n" % (self.team_id,self.teamname,self.sport,self.age,self.create_date,self.active)
class Player(db.Model):
__tablename__ = 'players'
player_id = db.Column(db.Integer, primary_key=True)
playername = db.Column(db.String(120), index=True, unique=True, nullable=False)
address = db.Column(db.String(120))
city = db.Column(db.String(48))
state = db.Column(db.String(2))
zip = db.Column(db.String(5))
dob = db.Column(db.String(10))
position = db.relationship("Position_bb", uselist=False, backref="players")
def __repr__(self):
return "PlayerID: %r\nPlayerName: %r\nAddress: %r\nCity: %r\nState: %r\nZip: %r\nDOB: %r\n" % (self.player_id,self.playername,self.address,self.city,self.state,self.zip,self.dob)
class Position_bb(db.Model):
__tablename__ = 'positions_bb'
position_id = db.Column(db.Integer, primary_key=True)
p = db.Column(db.Integer(), default=5, nullable=False)
c = db.Column(db.Integer(), default=5, nullable=False)
fb = db.Column(db.Integer(), default=5, nullable=False)
sb = db.Column(db.Integer(), default=5, nullable=False)
tb = db.Column(db.Integer(), default=5, nullable=False)
ss = db.Column(db.Integer(), default=5, nullable=False)
lf = db.Column(db.Integer(), default=5, nullable=False)
cf = db.Column(db.Integer(), default=5, nullable=False)
rf = db.Column(db.Integer(), default=5, nullable=False)
bench = db.Column(db.Integer(), default=5, nullable=False)
available = db.Column(db.Integer(), default=5, nullable=False)
fk_player = db.Column(db.Integer, db.ForeignKey('players.player_id'))
def __repr__(self):
return "PositionID: %r\nP: %r\nC: %r\n1B: %r\n2B: %r\n3B: %r\nSS: %r\nLF: %r\nCF: %r\nRF: %r\nBench: %r\nAvailable: %r\n" %(self.position_id,self.p,self.p,self.fb,self.sb,self.tb,self.ss,self.lf,self.cf,self.rf,self.bench,self.available)