【问题标题】:InvalidRequestError: Could not find a FROM clause to join fromInvalidRequestError:找不到要加入的 FROM 子句
【发布时间】:2018-04-13 12:29:35
【问题描述】:

我对 Employee 和 Leaves Applied 表的模型定义如下两个表:

# Class for creating employee table
class Employee(Base):
__tablename__ = "employee"
id = Column(Integer, primary_key=True, nullable=False)
name = Column(String(30), nullable=False)
designation = Column(Integer,
                   ForeignKey("designation.id",
                              use_alter=True,
                              name="fk_designation",
                              onupdate="CASCADE",
                              ondelete="RESTRICT"))
team = Column(Integer, ForeignKey("team.id",
                                use_alter=True,
                                name="fk_team",
                                onupdate="CASCADE",
                                ondelete="RESTRICT"))
workstation_id = Column(String(30), nullable=False)
phone_extension = Column(String(30), nullable=False)
leave_eligibility_id = Column(Integer,
                            ForeignKey("leaves_eligibility.id",
                                       use_alter=True,
                                       name="fk_leave_eligibility", 
                                       onupdate="CASCADE",
                                       ondelete="RESTRICT"))
manager_id = Column(Integer, ForeignKey("employee.id",
                                      use_alter=True,
                                      name="fk_manager_id",
                                      onupdate="CASCADE",
                                      ondelete="RESTRICT"))
leave_approver_id = Column(Integer,
                         ForeignKey("employee.id",
                                    use_alter=True,
                                    name="fk_leaveapprover_id",
                                    onupdate="CASCADE",
                                    ondelete="RESTRICT"))
leave_recommender_id = Column(Integer,
                            ForeignKey("employee.id",
                                       use_alter=True,
                                       name="fk_leaverecommender_id",
                                       onupdate="CASCADE",
                                       ondelete="RESTRICT"))


def __init__(self, name, designation,team,workstation_id,     phone_extension,leave_eligibility_id,manager_id,leave_approver_id,leave_recommender_id):
self.name = name
self.designation = designation
self.team = team
self.workstation_id = workstation_id
self.phone_extension = phone_extension
self.leave_eligibility_id = leave_eligibility_id
self.manager_id = manager_id
self.leave_approver_id = leave_approver_id
self.leave_recommender_id = leave_recommender_id


# Class for creating team table
class LeavesApplied(Base):
__tablename__ = "leaves_applied"
id = Column(Integer, primary_key=True, nullable=False)
employee_id = Column(Integer,
                   ForeignKey("employee.id",
                              use_alter=True,
                              name="fk_emp_id",
                              onupdate="CASCADE",
                              ondelete="RESTRICT"))
from_date = Column(Date, nullable=False)
to_date = Column(Date, nullable=False)
half_day = Column(TINYINT(1))
type_id = Column("type_id",
               mysql.ENUM("CASUAL_LEAVE",
                          "SICK_LEAVE",
                          "PRIVILEGED_LEAVE",
                          "ON_DUTY",
                          "AUTHORISED_LOSS_OF_PAY"))
decided_by_id = Column(Integer,
                     ForeignKey("employee.id",
                                use_alter=True,
                                name="fk_decided_by_id",
                                onupdate="CASCADE",
                                ondelete="RESTRICT"))
reason = Column(TEXT)
status = Column("status",
              mysql.ENUM("RECOMMENDED",
                         "DECLINED",
                         "APPROVED",
                         "PENDING"))
recommended_by_id = Column(Integer,
                         ForeignKey("employee.id",
                                    use_alter=True,
                                    name="fk_recommended_by_id",
                                    onupdate="CASCADE",
                                    ondelete="RESTRICT"))

children=relationship("Employee", 
                         backref=backref('parent',remote_side=[employee_id]),
                     foreign_keys='LeavesApplied.employee_id',

                     # Children will be represented as a dictionary
                     # On the attribute of manager_id
                     collection_class=attribute_mapped_collection(
                                      'id'),)

def   __init__(self,employee_id,from_date,to_date,half_day,type_id,decided_by_id,reason,status,rec    ommended_by_id):
self.employee_id=employee_id
self.from_date = from_date
self.to_date = to_date
self.half_day = half_day
self.type_id = type_id
self.decided_by_id=decided_by_id
self.reason = reason
self.status = status
self.recommended_by_id=recommended_by_id

正在执行以下查询

rows=self.db.query(LeavesApplied,Employee)
.join(Employee)
.filter(LeavesApplied.employee_id== Employee.id)
.filter(Employee.id==1255).all()

但它抛出一个错误 InvalidRequestError:找不到要加入的 FROM 子句。
尝试加入,但得到:无法确定“leaves_applied”和“employee”之间的加入;表之间存在多个外键约束关系。请明确指定此连接的“onclause”。

【问题讨论】:

  • 抱歉。现在我在问题中添加了模型定义。请再次查看@van

标签: python sqlalchemy


【解决方案1】:

错误信息是绝对正确的。根据您发布的代码,可以通过三种方式连接这两个表:

  • LeavesApplied.employee_id
  • LeavesApplied.decided_by_id
  • LeavesApplied.recommended_by_id

这正是 sqlalchemy 所关注的,因为它不知道您想在哪个 relationship/oncluause 上执行连接。

用下面的代码替换你的代码应该可以解决问题。这里我假设你想加入LeavesApplied.employee_id,因此我注释掉了filter 子句,因为在这种情况下它是多余的:

rows = (session.query(LeavesApplied,Employee)
        .join(Employee, LeavesApplied.children) #.join(Employee)
        #.filter(LeavesApplied.employee_id== Employee.id)
        .filter(Employee.id==1255).all()
        )

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 2018-08-18
    • 2018-03-25
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多