【问题标题】:How to do a many to many query in Flask-SQL Alchemy?如何在 Flask-SQLAlchemy 中进行多对多查询?
【发布时间】:2014-05-18 07:59:25
【问题描述】:

我正在使用 Flask 和 SQL-Alchemy 为我的 Android 应用程序创建 API。我有一个 MySQL 数据库,其中的表设置如下:

symptoms:
|    _id     |    symptom     |

food_categories:
|    _id     |    food_categories   |

food_recommendation_type:
|    _id     |    food_categories   |

symptom_food_relationship: (This table is association table relating all three)
|     id     |       symptom_id     |   food_category_id  | food_recommendation_type_id  |

在我的 Flask 应用程序中,我已经绘制了每个表:

symptom_food_relationship_table = db.Table('symptom_food_relationship',
                       db.Column('id', db.Integer),
                       db.Column('symptom_id', db.Integer, ForeignKey('symptoms._id')),
                       db.Column('food_category_id', db.Integer, ForeignKey('food_categories._id')),
                       db.Column('food_recommendation_type_id', db.Integer, ForeignKey('food_recommendation_type._id')))

class Symptom(db.Model):
__tablename__ = 'symptoms'
_id = db.Column(db.Integer, primary_key=True)
symptom = db.Column(db.String(100))
symptom_food_relationship = relationship("Food_Categories",
                                         secondary=symptom_food_relationship_table)

class Food_Categories(db.Model):
__tablename__ = 'food_categories'
_id = db.Column(db.Integer, primary_key=True)
food_categories = db.Column(db.String(30))

class Food_Recommendation_Type(db.Model):
__tablename__ = 'food_recommendation_type'
_id = db.Column(db.Integer, primary_key=True)
food_recommendation_type = db.Column(db.String)

表格如下所示:

id symptom_id food_categoryid food_recommendation_id
1   1          2                    1
11  1          8                1
21  1          0                3
31  1          3                3

我的问题是将这些值更改为它们的名称的查询。要查询一张表,我会说结果 = Symptom.query.all()。我知道完成此操作的 SQL 语句是...

SELECT s.symptom, fc.food_categories, fr.food_recommendation_type
FROM symptoms AS s 
INNER JOIN symptom_food_relationship AS srt
INNER JOIN food_categories AS fc
INNER JOIN food_recommendation_type AS fr
ON s._id = srt.symptom_id
AND fc._id = srt.food_category_id
AND fr._id = srt.food_recommendation_type_id
WHERE s._id='1'
ORDER BY s.symptom, food_categories

与之等效的 SQL alchemy 查询语句是什么。所以我可以在 JSON 响应中构造它。

【问题讨论】:

    标签: python mysql sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    你想想出这样的东西:

    results = (session.query(Symptom)
                  .join(Symptom. symptom_food_relationship)
                  .values(Symptom.symptom,
                          Food_Categories. food_categories,
                          Food_Recommendation_Type.food_recommendation_type))
    

    结果是这样收集的:

    resultlist = []
    for username, message, time in results:
        resultlist.append({'symptom': symptom,
                           'food_categories': food_categories,
                           'food_recommendation_type': food_recommendation_type})
    

    可能有更优雅的方式来处理您的数据结构,但这个应该可以工作。

    最好阅读有关此问题的文档: http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html#sqlalchemy.orm.query.Query.join

    祝你好运:)

    【讨论】:

    • 您的回答让我走上了正轨。但是当我拨打这个电话时,我看到症状,食物类别正确出现,但它们对于食物推荐类型表中的每个值都是重复的。食物推荐类型由 3 个值(增加、限制、避免)组成。当我使用过滤器查询症状时,symbol_id =1 结果应该是 4 个数组,但它会吐出 12 个(4 * 3 个建议),因为它使每个建议的建议类型增加了三倍。我知道如何设置我的症状类以将类别和记录联系起来,现在它只是连接到 Food_categories
    • 如果我理解正确,那么这就是返回列表。这样您就可以将所有表格结果合并到 1 个列表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2021-08-28
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多