【问题标题】:Flask SqlAlchemy join two models without foreign key MYSQLFlask SqlAlchemy 连接两个没有外键的模型 MYSQL
【发布时间】:2015-08-27 19:01:59
【问题描述】:

我正在加入两个没有外键的模型:

型号:

class Users(db.Model):
    __tablename__ = "Users"
    userName = db.Column(db.String, primary_key=True)
    lastLogin = db.Column(db.DateTime)

class TimeOff
    __tablename__ = "timeOff"
    timeOffID = db.Column(db.Integer, primary_key=True)
    userName = db.Column("userName", db.String,   db.ForeignKey('appUsers.userName')),
    dayWork = db.Column(db.DateTime)

查看:

result = db.session.query(models.Users).join(models.TimeOff)

sqlalchemy.exc.InvalidRequestError: 找不到要加入的 FROM 子句。 尝试加入但得到:在“TimeOff”和“Users”之间找不到任何外键关系。

我没有在表中定义外键

【问题讨论】:

    标签: python mysql flask-sqlalchemy


    【解决方案1】:

    在我的情况下,我想将两个对象连接起来,这样我就可以得到PostsAuthor信息,但是我不想使用架构级别的外键设计来关联两个表.这是我的代码:

    class Posts(db.Model):
        id= db.Column(db.String, primary_key=True)
        author_code= db.Column(db.String)
        ...
    
    class Author:
        id= db.Column(db.Integer, primary_key=True)
        name= db.Column(db.String),
        code= db.Column(db.String)
        address= db.Column(db.String)
        ...
    

    我们可以这样添加代码:

    from sqlalchemy.orm import relationship
    
    class Posts(db.Model):
        id= db.Column(db.String, primary_key=True)
        author_code= db.Column(db.String)
        ...
        # add this line
        author_info = relationship('Author',
                               foreign_keys=[author_code],
                               primaryjoin='Author.code == Posts.author_code')
    

    那么我们可以通过这样的查询得到author_info

    post_id = xxx # some id you defined
    post = Posts.query.filter_by(id=post_id).one_or_none()
    
    # here you can get `author_info` attributes you want.
    print(dir(post),post.author_info)
    

    您可以通过链接here了解更多信息,并阅读文档Configuring how Relationship Joins — SQLAlchemy 1.4 Documentation

    【讨论】:

      【解决方案2】:

      这对我有用, 我有 3 个表,并且我有 rtf_id 对所有三个表都是唯一的,您必须使用 select_from 关键字告诉表从左侧开始。

      db_data = dbobj.session.query(A, B, C). \
      select_from(A).join(B, B.rtf_id == A.rtf_id). \
      join(C, C.rtf_id == A.rtf_id).all()
      

      【讨论】:

        【解决方案3】:

        这是一个旧帖子,但我遇到了类似的问题

        result = session.query(models.Users).join(models.TimeOff, models.Users.userName == models.TimeOff.userName).all()
        

        通过这种方法,我可以达到第一个对象的特征,即用户,但不能达到 TimeOff。我想知道是否有可能达到辅助对象的属性。但我希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          为了改进@Matt Healy 的回答,如果您还希望能够访问连接对象上的属性,您可以执行以下操作:

          user, timeOff = db.session.query(Users, TimeOff).join(
              TimeOff, Users.userName == TimeOff.userName
          ).first()
          

          然后timeOff.dayWork 等将提供您需要的信息。

          【讨论】:

          【解决方案5】:

          您需要告诉 SQLAlchemy 如何连接表。试试这样的:

          result = db.session.query(Users).join(TimeOff,Users.userName==TimeOff.userName)
          

          【讨论】:

          • 此连接是否适用于不相关的表?
          • 这适用于不相关的表。确保在运行时填充您的表。我花了一段时间才意识到我没有得到任何结果,因为我的桌子没有人。
          • 有没有办法扩展这种语法,以便在连接之前过滤两个表之一?
          • 但是如何访问TimeOff的属性呢?
          • @Mithril - 我想我明白了,你可以这样做user, time_off = db.session.query(Users, TimeOff).join(TimeOff, Users.userName == TimeOff.userName).first()
          猜你喜欢
          • 2015-09-11
          • 1970-01-01
          • 2017-01-23
          • 2015-02-02
          • 2020-09-23
          • 2021-03-08
          • 2011-09-15
          • 2015-03-10
          • 2019-03-29
          相关资源
          最近更新 更多