python中flask和sqlalchemy的多对多
Posted
技术标签:
【中文标题】python中flask和sqlalchemy的多对多【英文标题】:Many-to-many with flask and sqlalchemy in python 【发布时间】:2014-02-26 21:22:38 【问题描述】:我正在尝试创建一个多对多关系表,其中包含更多信息,而不仅仅是两个 id。它不起作用。我显然用通用名称标准化了我的表格。但是用例可能就像一个用户表,有一个帖子表和一个喜欢关系表,类似的东西。当我做这些表时,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 对象发布值。类似于 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'))
而表1除了增加tablename
外没有变化但现在我明白了
sqlalchemy.exc.ArgumentError: Mapper Mapper|Relationship|relatioship could not assemble any primary key columns for mapped table 'Relationship'
【问题讨论】:
您显示的代码不应该给您所描述的错误。仔细检查你的拼写和括号;确保每个 表至少定义一个primary_key
列。此外,像reload(myModels)
这样的技巧通常不适用于 sqlalchemy.ext.declarative;重新启动您的应用程序。
是的,它们都有一个 primary_key 列。我试图重新加载应用程序,但出现此错误,它甚至无法启动。
【参考方案1】:
Table1
上有两个 relationship
声明,但从您发布的代码中,我只能看到一条到 Table2
的路径,通过 Relationship.table2_id
。
看起来您正试图在中间关系上建立多对多关系和额外的元数据。这在 sqlalchemy 文档中称为association object pattern。为此,到目前为止,除了Table1.rela2
之外,您所拥有的一切都很好,您已经拥有了。需要删除那个“流氓”relationship
。
为了方便在Table1
和Table2
之间建立真正的关系,您需要使用association proxy。
【讨论】:
好的,所以我尝试使用docs.sqlalchemy.org/en/rel_0_9/orm/… 转换我的代码,但现在我得到 sqlalchemy.exc.ArgumentError: Mapper Mapper|Vote|vote could not assemble any primary key columns for mapped table'Relationship'以上是关于python中flask和sqlalchemy的多对多的主要内容,如果未能解决你的问题,请参考以下文章
python web开发-flask中使用sqlalchemy
python web开发-flask中sqlalchemy的使用