了解SQLAlchemy中的联接?

时间:2017-02-13 22:18:51

标签: python database sqlalchemy flask-sqlalchemy

我有很多关于联接如何在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的讲师联系。但是我的程序看起来会有很多这样的联接,在继续之前我希望能更好地理解什么是实际上发生在这里。

任何帮助都会很有用。

0 个答案:

没有答案