python - SqlAlchemy 和 Flask,如何查询多对多关系

标签 python sql sqlalchemy many-to-many flask

我需要帮助创建 SqlAlchemy 查询。

我正在做一个使用 SqlAlchemy 的 Flask 项目。我在我的 models.py 文件中创建了 3 个表:Restaurant、Dish 和 restaurant_dish。

restaurant_dish = db.Table('restaurant_dish',
    db.Column('dish_id', db.Integer, db.ForeignKey('dish.id')),
    db.Column('restaurant_id', db.Integer, db.ForeignKey('restaurant.id'))
)

class Restaurant(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), index = True)

    restaurant_dish = db.relationship('Dish', secondary=restaurant_dish,
        backref=db.backref('dishes', lazy='dynamic'))


class Dish(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), index = True)
    info = db.Column(db.String(256), index = True)

我已将数据添加到 restaurant_dish 表,它应该可以正常工作。我需要帮助的地方是了解如何使用餐厅正确获取菜肴。原始 SQL 应该是这样的:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id

我已经设法完成但没有工作:

x = Restaurant.query.filter_by(Restaurant.restaurant_dish.contains(name)).all()

感谢您的帮助,我也感谢可以为我指明正确方向的教程(官方文档超出了我的想象)。

最佳答案

关系的语义看起来不正确。我认为应该是这样的:

class Restaurant(db.Model):
    ...

    dishes = db.relationship('Dish', secondary=restaurant_dish,
        backref=db.backref('restaurants'))

然后,要检索餐厅的所有菜肴,您可以:

x = Dish.query.filter(Dish.restaurants.any(name=name)).all()

这应该生成如下查询:

SELECT dish.*
FROM dish
WHERE
    EXISTS (
        SELECT 1
        FROM restaurant_dish
        WHERE
            dish.id = restaurant_dish.dish_id
            AND EXISTS (
                SELECT 1
                FROM restaurant
                WHERE
                    restaurant_dish.restaurant_id = restaurant.id
                    AND restaurant.name = :name
            )
    )

关于python - SqlAlchemy 和 Flask,如何查询多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12593421/

相关文章:

python - 在 Flask-SQLAlchemy 的同一个类中使用不同的绑定(bind)

python 在异步回调中调用 django 的渲染函数不起作用

java - Mybatis 嵌套集合不能正确使用列前缀

python - 根据条件计算行数的混合表达式

php - 比较不同供应商的一组产品 - SQL 与 PHP

SQL Server 选择两个值之间的行

python - SQLAlchemy/MySQL 序列化访问死锁

python - 使用 Python 将数据写入 USB 扫描仪

python - 变量在某个地方失去了它的值(value)

python - Django override_settings 不适用于运行多个测试