2014-11-21 228 views
0

在SQLAlchemy的文檔,http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html一切都應該工作正常,但我會得到一個名爲錯誤瓶SQLAlchemy的許多一對多的關係,需要secondaryjoin和primaryjoin出於某種原因

原始的例外是:無法確定母公司之間的連接條件/關係User.rank_r上的子表。指定一個'primaryjoin'表達式。如果存在「次要」,則還需要「次要連接」。

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:在映射器映射器|用戶|用戶...上沒有配置列rank.id(原因:UnmappedColumnError:映射器映射器|用戶|用戶...上沒有配置列rank.id)'SELECT rank .id AS rank_id,rank.name AS rank_name \ nFROM等級,等級,用戶\ nWHERE? = ranks.rank_id AND users.id = ranks.user_id'[immutabledict({})]

這是當我嘗試在模板中調用「User.rank_r」時顯示的內容。

+0

- 你確定你需要一個多對多的表,而不僅僅是一對多的模式嗎? – Doobeh 2014-11-21 21:56:47

+0

我在想你是對的,隊長不可能是主力。另一方面,我正在考慮一個可能有更多模塊/區域的系統,這意味着您可以在一個模塊中擔任上尉,並且在另一個模塊中擔任主要職位。 – Dexter 2014-12-09 19:35:39

回答

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