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

为了方便在Table1Table2 之间建立真正的关系,您需要使用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的使用

Flask SQLAlchemy 多对多插入重复条目

Flask-SQLAlchemy 和 SQLAlchemy

Python Flask没有从SQLAlchemy数据库中删除正确的id

python-flask复习——Flask —SQLAlchemy