您好我正在尝试修改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)
答案 0 :(得分:0)
如果我将此语法拼写错误,我会得到完全措辞错误
...
q = q.join(Foo.id == Bar.id)
...
而不是
...
q = q.join(Foo,Foo.id == Bar.id)
...
也许这对你有帮助