2014-04-12 2 views
3

나는 간단한이 같은 쿼리에 가입 할Sqlalchemy 일대 다 관계에 참여 하시겠습니까?

SELECT food._id, food.food_name, food_categories.food_categories FROM food JOIN food_categories ON food.food_category_id = food_categories._id 

을 시도하지만 오류를 수신 유지하고있다. 다음은 클래스가 설정되는 방법입니다.

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(db.Model): 
    __tablename__ = 'food' 
    _id = db.Column(db.Integer, primary_key=True) 
    food_name = db.Column(db.String(40)) 
    food_category_id = db.Column(db.Integer, ForeignKey(Food_Categories._id)) 
    food_category = relationship("Food_Categories") 

내 쿼리 함수는 다음과 같습니다.

@app.route('/foodlist') 
def foodlist(): 
    if request.method == 'GET': 
     results = Food.query.join(Food_Categories.food_categories).all() 

    json_results = [] 
    for result in results: 
     d = {'_id': result._id, 
     'food': result.food_name, 
     'food_category': result.food_categories} 
    json_results.append(d) 

    return jsonify(user=json_results) 

나는 플라스크를 사용하고 있습니다. 내가이 길을 부르면 나는이 오류를 얻는다.

AttributeError: 'ColumnProperty' object has no attribute 'mapper' 

나는 기본적으로이 원하는 :

|  id  | food_name | food_category | 

을 다른 테이블에있는 식품 카테고리의 실제 이름으로 대체 food_category_id 열 수 있습니다.

테이블/관계를 올바르게 설정 했습니까? 내 쿼리가 올바르게 설정 되었습니까?

+0

'증상'이란 무엇입니까? – ACV

+0

죄송합니다. 입력했습니다. 그것은 음식이기로되어있다. – user3502585

답변

3

테이블과 관계가 올바르게 설정되었습니다. 검색어에 변경이 필요합니다.

오류의 원인은 테이블 (또는 매핑 된 모델 개체) 대신에 열 (Food_Categories.food_categories)에 대한 조인을 수행하려고한다는 것입니다. 기술적으로, 당신은 오류 해결하기 위해 아래와하여 쿼리를 교체해야합니다 :

results = Food.query.join(Food_Categories).all() 

이 오류를 수정 한 것입니다,하지만 그것은 단지 결과로 Food의 인스턴스를 반환하기 때문에, 당신이 원하는 SQL 문을 생성하지 않습니다 조인이 있더라도.

당신이 염두에두고 정확히 SQL 문 생성하는 쿼리를 구축하기 위해

:

results = (db.session.query(Food._id, Food.food_name, 
     Food_Categories.food_categories,) 
    .join(Food_Categories)).all() 
for x in results: 
    # print(x) 
    print(x._id, x.food_name, x.food_categories) 

이 경우 결과가 Food의 인스턴스가 아닌 점에 유의하십시오, 그러나 3 열 개 값이 오히려 tuples .

관련 문제