簡體   English   中英

Python中的燒瓶和sqlalchemy多對多

[英]Many-to-many with flask and sqlalchemy in python

我正在嘗試做一個多對多關系表,而不僅僅是兩個ID。 它不起作用。 我顯然用通用名稱對表進行了標准化。 但是用例可能像user表,post表和likes關系表之類的東西。 當我做這些表時,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做到這一點。

謝謝。

編輯1

使用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不變,只是增加了表名

但是現在我明白了

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

Table1上有兩個relationship聲明,但是從您發布的代碼中,我只能通過Relationship.table2_id看到Table2一個路徑。

看起來您正在嘗試與多對多關系以及中間關系上的額外元數據。 這在sqlalchemy文檔中稱為關聯對象模式 為此,到目前為止,您所擁有的一切,除了Table1.rela2都很好,您都已經擁有了。 這種“流氓” relationship需要消除。

為了獲得在Table1Table2之間建立真實關系的便利,您需要使用關聯代理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM