2014-02-26 93 views
2

我想做一个多对多的关系表与更多的信息,而不仅仅是两个ID。它不起作用。我显然是用通用名称来标准化我的表格。但是用例可能像用户表一样,有一个帖子表和一个喜欢关系表,就像那样。当我做这些表,蟒蛇给我说:多对多烧瓶和sqlalchemy python

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Table2.rela1 - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression. 

因此,这里是我的关系表

class Relationship(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    table1_id = db.Column(db.Integer, db.ForeignKey('Table1.id')), 
    table2_id = db.Column(db.Integer, db.ForeignKey('Table2.id')), 
    value = db.Column(db.Integer), #a number 
    date = db.Column(db.DateTime) #actual time of the entry 

这里是我的表1

class Table1(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    rela1 = db.relationship('Relationship', backref = 'rel1', lazy = 'dynamic') 
    rela2 = db.relationship('Table2', backref = 'rel2', lazy = 'dynamic') 

这里是我的表2

class Table2(db.Model):  
    id = db.Column(db.Integer, primary_key = True) 
    table1_id = db.Column(db.Integer, db.ForeignKey('table1.id')) 
    rela1 = db.relationship('Relationship', backref = 'rel3', lazy = 'dynamic') 

感谢您的帮助我。

如果这可以解决,那么我的第二个问题是创建一个函数来计算每个Table2对象的总“价值”,而不管哪个table1对象发布该值。类似于select和sum by table2.id,但我真的不明白如何用python和flask和sqlalchemy来做到这一点。

谢谢。

EDIT1

使用http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#association-object

我改变到

class Relationship(db.Model): 
    __tablename__ = 'relationship' 
    table1_id = db.Column(db.Integer, db.ForeignKey('Table1.id'), primary_key = True), 
    table2_id = db.Column(db.Integer, db.ForeignKey('Table2.id'), primary_key = True), 
    value = db.Column(db.Integer), #a number 
    date = db.Column(db.DateTime) #actual time of the entry 
table2obj = db.relationship("Table2", backref="table2_assocs") 

然后

class Table2(db.Model): 
    __tablename__ = 'table2' 
    id = db.Column(db.Integer, primary_key = True) 
    table1_id = db.Column(db.Integer, db.ForeignKey('table1.id')) 

和表1是除了加入标签的不变lename

,但现在我得到

sqlalchemy.exc.ArgumentError: Mapper Mapper|Relationship|relatioship could not assemble any primary key columns for mapped table 'Relationship' 
+0

您显示的代码不应该给您提供您描述的错误。仔细检查你的拼写和括号;确保*每个*表至少定义一个'primary_key'列。另外,像'reload(myModels)'这样的技巧通常不适用于sqlalchemy.ext.declarative;重启你的应用程序 – SingleNegationElimination

+0

是的,他们都有一个primary_key列。我试图重新加载应用程序,但有了这个错误,它甚至没有启动。 – Wonay

回答

0

有两个relationship声明上Table1,但是从您发布的代码,我只能看到一条路径Table2,通过Relationship.table2_id

看起来您正试图与中间关系上的额外元数据建立多对多关系。这在sqlalchemy文档中称为association object pattern。为此,除了Table1.rela2之外,你所拥有的一切都很好,你很好。需要删除“流氓”relationship

为了获得从Table1Table2的真实关系的便利,您需要使用association proxy

+0

好吧,所以我试图使用http://docs.sqlalchemy转换我的代码。org/en/rel_0_9/orm/relationships.html#association-object但现在我得到 sqlalchemy.exc.ArgumentError:Mapper Mapper |投票无法为映射表'Relationship'组装任何主键列 – Wonay

+0

请参阅EDIT1在主帖中更新 – Wonay