我有很多关于联接如何在SQLAlchemy中工作,或者可能完全是SQL的工具..以下代码可以工作,但仅仅是因为运气和反复试验。我不确定为什么会产生预期的结果。
在这种情况下,我想获得当前讲师的学生列表,所有讲师和学生键都加入了一个关联表......就像这样..
class Stud(db.Model):
__tablename__ = 'stud'
id = db.Column(db.Integer, primary_key=True, nullable=False)
first_name = db.Column(db.String(64), nullable=True)
last_name = db.Column(db.String(64), nullable=True)
email = db.Column(db.String(64), nullable=True)
cell = db.Column(db.String(10), nullable=True)
home = db.Column(db.String(10), nullable=True)
birthday = db.Column(db.DateTime(), nullable=True)
handicap = db.Column(db.String(7), nullable=True)
years_playing = db.Column(db.String(7), nullable=True)
gender = db.Column(db.String(7), nullable=True)
opt_in = db.Column(db.Boolean, nullable=True)
profile = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, nullable=True)
stud_inst_link = db.Table('stud_inst_link',
db.Column('inst_id', db.Integer, db.ForeignKey('inst.id')),
db.Column('stud_id', db.Integer, db.ForeignKey('stud.id')))
class Inst(db.Model):
__tablename__ = 'inst'
id = db.Column(db.Integer, primary_key=True, nullable=False)
first_name = db.Column(db.String(64), nullable=True)
last_name = db.Column(db.String(64), nullable=True)
email = db.Column(db.String(64), nullable=True)
cell = db.Column(db.String(10), nullable=True)
home = db.Column(db.String(10), nullable=True)
email_sig = db.Column(db.String, nullable=True)
birthday = db.Column(db.DateTime, nullable=True)
tax_rate = db.Column(db.Integer, nullable=True)
opt_in = db.Column(db.Boolean, nullable=True)
profile = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, nullable=False)
studs = db.relationship('Stud', secondary=stud_inst_link,
backref=db.backref('students', lazy='dynamic'))
最终产生我想要的结果的代码就是这个;
inst_id = 20
studs = Stud.query.join(stud_inst_link).filter(stud_inst_link.c.inst_id == inst_id).all()
for x in studs:
print(x.first_name)
它给了我关联表中每个学生的列表,他们与ID为20的讲师联系。但是我的程序看起来会有很多这样的联接,在继续之前我希望能更好地理解什么是实际上发生在这里。
任何帮助都会很有用。