Skip to main content
 首页 » 编程设计

python之SQLAlchemy 多对多连接

2025年05月04日10www_RR

这是我的模型:产品和标签具有多对多关系

products_tags_table=db.Table('products_tags', 
                        db.Column('product_id', db.Integer,db.ForeignKey('products.id'), nullable=False), 
                        db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),nullable=False), 
                        db.PrimaryKeyConstraint('product_id', 'tag_id') 
                        ) 
 
class Tag(db.Model): 
    __tablename__ = "tags" 
    id = db.Column( db.Integer, primary_key = True) 
    name = db.Column( db.String(256) ) 
    description = db.Column( db.Text() ) 
    background_img_url = db.Column( db.String(256) ) 
    products =db.relationship('Product', 
                              secondary=products_tags_table, 
                              backref='product_tags' 
                             )   
 
 
 
 
class Product(db.Model): 
    __tablename__ = "products" 
    id = db.Column( db.Integer, primary_key = True) 
    name = db.Column( db.String(256) ) 
    tags=db.relationship('ProductTag', 
                        secondary=products_tags_table, 
                        backref='tag_products' 
                        )   

当我使用产品加入标签时。我得到错误:

类“sqlalchemy.exc.InvalidRequestError”:找不到要加入的 FROM 子句。尝试加入 ,但得到:找不到“product_tags”和“products”之间的任何外键关系。

这是我的加入代码:

avai_tags = Tag.query.join(Product).order_by(ProductTag.name) 

我错过了什么吗?

请您参考如下方法:

首先,在您的产品表中,您的第二个外键需要属性引用表名“tags”,因此将“tag.id”更改为“tags.id”

products_tags_table=db.Table('products_tags', 
                    db.Column('product_id', db.Integer,db.ForeignKey('products.id'), nullable=False), 
                    db.Column('tag_id',db.Integer,db.ForeignKey('tags.id'),nullable=False),  
                                                                   #^Missing 's' 
                    db.PrimaryKeyConstraint('product_id', 'tag_id') 
                    ) 

然后在您的产品模型中,您希望准确引用适当模型的名称。将“ProductTag”更改为“标签”

tags=db.relationship('Tag', # 'ProductTag' <- This is a relationship to the Tag table. 
                    secondary=products_tags_table, 
                    backref='tag_products' 
                    )   

然后像这样尝试加入

query = Tag.query.join(Product, Tag.products) 
 
avail_tags = query.order_by(Tag.name).all()