2014-11-21 1 views
0

, http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html 모든 것이 잘 작동해야하지만 오류가 호출되는 어떤 이유로 secondaryjoin 및 primaryjoin 필요영약 SQLAlchemy의는 다 대다 관계, SQLAlchemy의 워드 프로세서에서

원래 예외는 아니었다 : 부모 사이에 조인 조건을 결정할 수 없음/관계에 대한 하위 테이블 User.rank_r. 'primaryjoin'표현식을 지정하십시오. 'secondary'가 있으면 'secondaryjoin'도 필요합니다.

class User(db.Model, UserMixin): 

    __tablename__ = 'users' 
    rank_r = db.relationship('Rank', 
           secondary=ranks, 
           backref=db.backref('users', lazy='dynamic')) 


class Rank(db.Model): 
    __tablename__ = 'rank' 
    id = Column(db.Integer, primary_key=True) 
    name = Column(db.String(STRING_LEN), nullable=False, unique=True) 


ranks = db.Table('ranks',  
    db.Column('rank_id', db.Integer, db.ForeignKey('rank.id')), 
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')) 
) 

기본적으로 나는이 작업을 수행하려고 :

SELECT u.id, u.name, r.name users u INNER JOIN ranks r ON r.id=rr.rank_id INNER JOIN rank rr ON rr.user_id==u.id 

이 같은 반환이 관계 코드는 실패 할 것

1 Bob Major 
2 Joey Captain 
3 Adam Brigadier General 

을 :

rank_r = db.relationship('Rank', 
          primaryjoin="(rank.c.id==ranks.c.rank_id)", 
          secondary="ranks", 
          secondaryjoin="(id==ranks.c.user_id)", 
          backref=db.backref('users', lazy='dynamic')) 

오류 :

StatementError : mapper Mapper | User | users ... (원래 원인 : UnmappedColumnError : 열 rank.id가 매퍼 Mapper | User | users ...에 구성되어 있지 않습니다.) 'SELECT rank .id AS rank_id, rank.name AS rank_name \ nFROM 순위, 순위, 사용자 \ n 여기에는 무엇이 있습니까? = ranks.rank_id AND users.id = ranks.user_id '[immutabledict ({})]

템플릿에서 "User.rank_r"을 호출하려고 할 때 표시되는 내용입니다.

+0

- 일대 다 스키마뿐만 아니라 다 대다 테이블이 필요합니까? – Doobeh

+0

나는 네가 옳다고 생각했는데, 선장은 전공이 될 수 없다. 다른 한편으로는, 더 많은 모듈/영역을 가질 수있는 시스템에 대해 생각하고있었습니다. 즉, 한 모듈에서는 선장이되고 다른 모듈에서는 메이저가 될 수 있습니다. – Dexter

답변

1

당신의 코드가 괜찮아 보인다, 나는 것들 (내 수입을 줄이기 위해) 몇 가지를 제거하고이 후있어 일을 할 것 같다 : 한 사람이 많은 ranks-을하는 것이 보통이 아니다

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 


app = Flask(__name__) 
app.secret_key = 'MOO.' 
app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite://' # In memory. 
db = SQLAlchemy(app) 


ranks = db.Table('ranks', 
    db.Column('rank_id', db.Integer, db.ForeignKey('rank.id')), 
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')) 
) 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String()) 
    ranks = db.relationship('Rank',secondary=ranks, 
           backref=db.backref('users', lazy='dynamic')) 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return self.name 


class Rank(db.Model): 
    __tablename__ = 'rank' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(), nullable=False, unique=True) 

    def __repr__(self): 
     return self.name 

@app.route('/') 
def hello_world(): 
    return 'Hello World!' 


if __name__ == '__main__': 
    with app.app_context(): 
     db.create_all() 
     bob = User('Bob') 
     joey = User('Joey') 
     adam = User('Adam') 

     major = Rank(name='Major') 
     captain = Rank(name='Captain') 
     general = Rank(name='General') 

     db.session.add_all([bob, joey, adam, major, captain, general]) 

     bob.ranks.append(major) 
     joey.ranks.append(captain) 
     adam.ranks.append(general) 
     adam.ranks.append(captain) 

     db.session.commit() 

     users = User.query.all() 
     for user in users: 
      for rank in user.ranks: 
       print '{} {}'.format(user, rank) 

       # Bob Major 
       # Joey Captain 
       # Adam Captain 
       # Adam General