Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SqlAlchemy和Flask,如何查询多对多关系_Python_Sql_Sqlalchemy_Many To Many_Flask - Fatal编程技术网

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

Python SqlAlchemy和Flask,如何查询多对多关系,python,sql,sqlalchemy,many-to-many,flask,Python,Sql,Sqlalchemy,Many To Many,Flask,我需要帮助创建SqlAlchemy查询 我在做一个烧瓶项目,我在使用SqlAlchemy。我在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,

我需要帮助创建SqlAlchemy查询

我在做一个烧瓶项目,我在使用SqlAlchemy。我在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)
我已经将数据添加到餐厅的菜谱表中,它应该可以正常工作。我需要帮助的地方是了解如何正确使用餐厅获得菜肴。原始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
            )
    )

搜索了几个小时后,
Dish.restaurant.any
正是我要找的+祝你好运!这个答案比任何文档都好。如果我需要查询所有使用给定菜肴的餐厅,该怎么办?AKA,反向检索。当这家餐厅是一家餐厅时,有没有什么方法可以做
disk.restaurants.any(thisrestaurant)
?我可以
Dish.restaurants.any(id=thisrestaurant.id)
但是听起来有点棘手有没有关于“query.any”的文档找不到?