我正在尝试使用更多信息来执行多对多关系表而不仅仅是两个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'
答案 0 :(得分:0)
relationship
上有两个Table1
声明,但是根据您发布的代码,我只能通过Table2
看到Relationship.table2_id
的一条路径。
看起来您正在尝试与中间关系上的额外元数据建立多对多关系。这在sqlalchemy文档中称为association object pattern。为此,除了Table1.rela2
之外,你到目前为止所做的一切都很好,你很好。需要删除“流氓”relationship
。
为了方便实现Table1
到Table2
之间的真实关系,您需要使用association proxy。