Flask-SQLAlchemy并修改连接

时间:2015-01-12 10:07:01

标签: python flask sqlalchemy flask-sqlalchemy

您好我正在尝试修改join子句,因为它会自动加入。它加入了错误的条款。

JOIN schedule ON schedule.course_id  = course.course_id

而不是

JOIN schedule ON schedule.schedule_id = task.schedule_id

以下是我的ORM查询的样子:

from sqlalchemy.sql import and_

myclases = (1, 2, 3)
    mytask = db.session.query(
        Task.task_id,
        Task.task_name,
        Course.course_name,
        Schedule.schedule_day,
        Schedule.schedule_week,
        Schedule.schedule_year,
        Module.module_timestamp
        ).join(
            Course,
            and_(Schedule.schedule_id == Task.schedule_id), #this line
            Module
            ).filter(Task.class_id.in_(myclases))

标记了这一行并附有评论。显示我在哪里挣扎。

我读过如果你想修改一个连接子句,你必须使用and_。但如果我这样做,我会收到此错误:
AttributeError: Neither 'BinaryExpression' object nor 'Comparator' object has an attribute 'selectable'

有没有其他方法可以修改连接?

修改 - 添加了模型

class Task(db.Model):
    task_id = db.Column(db.Integer, primary_key=True)
    task_name = db.Column(db.String(64))

    course_id = db.Column(db.Integer, db.ForeignKey('course.course_id'))
    class_id = db.Column(db.Integer, db.ForeignKey('class.class_id'))
    schedule_id = db.Column(db.Integer, db.ForeignKey('schedule.schedule_id'))


class Course(db.Model):
    course_id = db.Column(db.Integer, primary_key=True)
    course_name = db.Column(db.String(64))

    schedule = db.relationship('Schedule', backref='course')
    task = db.relationship('Task', backref='course')
    mm_children_class_course = db.relationship('Class', secondary=class_course_identifier, backref=db.backref('courses'))
    mm_children_teacher_course = db.relationship('User', secondary=teacher_course_identifier)


class Schedule(db.Model):
    schedule_id = db.Column(db.Integer, primary_key=True)
    schedule_week = db.Column(db.Integer)
    schedule_day = db.Column(db.Integer)
    schedule_year = db.Column(db.Integer)

    course_id = db.Column(db.Integer, db.ForeignKey('course.course_id'))
    class_id = db.Column(db.Integer, db.ForeignKey('class.class_id'))
    module_id = db.Column(db.Integer, db.ForeignKey('module.module_id'))
    task = db.relationship('Task', backref='schedule')


class Module(db.Model):
    module_id = db.Column(db.Integer, primary_key=True)
    module_name = db.Column(db.String(64), unique=True)
    module_timestamp = db.Column(db.Integer)
    module_endtime = db.Column(db.Integer)
    schedule = db.relationship('Schedule', backref='module')


class_course_identifier = db.Table('class_course_identifier',
    db.Column('course_id', db.Integer, db.ForeignKey('course.course_id')),
    db.Column('class_id', db.Integer, db.ForeignKey('class.class_id'))
)

也许是解决方案 我可能找到了一个软解决方案,而不是修改连接我添加了一个过滤器。

db.session.query(
    Task.task_id,
    Task.task_name,
    Course.course_name,
    Schedule.schedule_day,
    Schedule.schedule_week,
    Schedule.schedule_year,
    Module.module_timestamp
).join(
    Course,
    Schedule,
    Module
).filter(
    Schedule.schedule_id == Task.schedule_id, # the added filter
    Task.class_id.in_(myclases)

1 个答案:

答案 0 :(得分:0)

如果我将此语法拼写错误,我会得到完全措辞错误

...
q = q.join(Foo.id == Bar.id)
...

而不是

...
q = q.join(Foo,Foo.id == Bar.id)
...

也许这对你有帮助