在python中有多对多的烧瓶和sqlalchemy

时间:2014-02-26 21:22:38

标签: python sqlalchemy flask flask-sqlalchemy

我正在尝试使用更多信息来执行多对多关系表而不仅仅是两个ID。它不起作用。我显然用通用名称标准化我的表。但用例可能就像一个用户表,一个post表和一个喜欢的关系表,就像那样。当我做这些表时,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

这是我的table1

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对象发布该值。类似于一个选择与sum和group 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'))
除了添加 tablename

之外,

和表1保持不变

但现在我

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

1 个答案:

答案 0 :(得分:0)

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

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

为了方便实现Table1Table2之间的真实关系,您需要使用association proxy