2017-12-01 24 views
1

私は、primaryjoinの条件を持つ関係を熱心にロードしようとしていて、それは私にUnknown column 'tags.type' in 'on clause'を伝え続けます。私は、テーブル名が結合にハードコードされているが、クエリがテーブルの名前をASにしようとしていると考えています。以下の全例:SQLAlchemy - プライマリジョインの関係を熱心にロード

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

db = SQLAlchemy() 

def create_app(): 
    app = Flask(__name__) 
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://test:[email protected]/JoinTest' 
    db.init_app(app) 
    return app 

class PostToTags(db.Model): 
    __tablename__ ='post_to_tags' 
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), primary_key=True) 
    tag_id = db.Column(db.Integer, db.ForeignKey('tags.id'), primary_key=True) 

class Tag(db.Model): 
    __tablename__ = 'tags' 
    id = db.Column(db.Integer, primary_key=True) 
    key = db.Column(db.Unicode(1024), nullable=False) 
    value = db.Column(db.Unicode(1024)) 
    type = db.Column(db.Enum('post'), default=None) 

class Post(db.Model): 
    __tablename__ = 'posts' 

    id = db.Column(db.Integer, primary_key=True) 

    tags = db.relationship(
     "Tag", 
     primaryjoin="and_(Post.id == PostToTags.post_id, Tag.type=='post')", 
     secondary='post_to_tags', 
    ) 

if __name__ == "__main__": 
    app = create_app() 
    with app.app_context(): 
     db.drop_all() 
     db.create_all() 
     tag = Tag(key='foo',value='bar', type='post') 
     post = Post() 
     post.tags.append(tag) 
     db.session.add_all((post, tag)) 
     db.session.commit() 

     q = db.session.query(Post).options(db.joinedload('tags')) 

     print q 
     print q.all() 

それが発する実際のクエリは次のようになります。

SELECT posts.id AS posts_id, tags_1.id AS tags_1_id, tags_1.`key` AS tags_1_key, tags_1.value AS tags_1_value, tags_1.type AS tags_1_type 
FROM posts LEFT OUTER JOIN (post_to_tags AS post_to_tags_1 INNER JOIN tags AS tags_1 ON tags_1.id = post_to_tags_1.tag_id) ON posts.id = post_to_tags_1.post_id AND tags.type = %(type_1)s 

お知らせその最後のON文の前にそれの名前tagテーブルtags_1に、その後テーブルへの最後の参照属性にアクセスしようとしましたtags.type

これを再考するにはどうすればよいですか?

ありがとうございます!

+0

は、ここで同じ問題が見つかりました:https://stackoverflow.com/questions/47327410/sqlalchemy-relationship-with-secondary-table-joining-behaviour-changes-between-l – user1914881

答えて

0

ほとんどの場合、post you linkedの場合と同じ問題がありますが、プライマリからセカンダリ結合を削除してSQLAlchemyに理解させる代わりに、プライマリの代わりにセカンダリを定義する必要があります。あなたのために:

tags = db.relationship(
    "Tag", 
    secondaryjoin="and_(Tag.id == PostToTags.tag_id, Tag.type == 'post')", 
    secondary='post_to_tags', 
) 
関連する問題