2013-08-20 1 views
0

외래 키를 필터링하려고하는데 내가 검색 한 결과 중 아무 것도 결과를 빌려주지 않았습니다.foreignkey에서 SQLALchemy filter_by() 이상한 SQL을 생성

내 쿼리 문은 어디에 있습니까?

testing = Comments\ 
    .filter(Comments.post_id==post_id) 
print(testing) 

testing = Comments\ 
     .query.join(Post, aliased=True)\ 
     .filter(Comments.post_id==post_id) 
print(testing) 

여기 내 클래스 정의는 제 1 및 제 2 케이스에서 생산되고있다

class Comments(db.Model): 

    comment_id = db.Column(db.Integer, primary_key=True) 
    post_id = db.Column(
     db.Integer, 
     db.ForeignKey("Post.post_id"), 
     nullable=False) 

class post(db.Model): 
    post_id = db.Column(db.Integer, primary_key=True) 

Comments = db.relationship(
     'Comments', 
     backref='Post', 
     lazy='dynamic') 

실제 SQL 쿼리의 모습입니다. 그들은 둘 다 이상하게 보입니다 : post_id_1. 두 경우 모두 null 세트가 반환됩니다. 내가 MySQL의 CLI에 간단한

Select * from Comments where post_id = 1

을 할 경우

FROM "Comments" 
WHERE "Comments".post_id = :post_id_1 

FROM "Comments" JOIN "post" AS "post_1" ON "post_1".post_id = "Comments".post_id 
WHERE "Comments".post_id = :post_id_1 

나는 결과 세트를 얻을.

Comments = db.relationship(
     'Comments', 
     backref='Post', 
     lazy='dynamic') 

를 아니면 그냥 복사/붙여 넣기 문제 (단지 확인하기 위해)입니다 : 귀하의 모델 정의는 이상한

+0

"wierd': pst_id_1' 물건"은 바운드 매개 변수라고합니다. 'echo = True'를'create_engine'에 전달함으로써 실행 된 실제 질의를 볼 수 있습니다. 그러면 매개 변수가 실제로 전달 된 문장이 있습니다. 따라서 쿼리 된 내용을 정확히 볼 수 있습니다. 이를 사용하여 쿼리의 차이점을 찾습니다. – javex

답변

0

는 다음과 같은 부분은 제대로 들여 쓰기되지 않습니다.

"이상한 : esc_id_1"이라고하는 것은 실제로 이름이 지정된 자리 표시 자입니다. SQL 문이 실행될 때 실제 값으로 바뀝니다 (주로 SQL 삽입을 피하기 위해 드라이버가 값을 이스케이프 처리해야합니다).

+0

들여 쓰기가 구문 적으로 정확합니다. 길이가 80자를 초과하는 줄을 구분하는 것은 제가 선호하는 방법입니다. 다른 모든 SQL 문은 '% s' 다음에 변수 목록을 사용합니다. 나는 이것이 변수 목록이 없기 때문에 "이상한"이라고 말했고 나는 단지 filter_by (comment_id = commit_id)와 같은 sql이 아니었다. 이상한 부분은 정수형 기본 키 또는 정수형 외래 키로 필터링 할 때 다른 SQL 문을 사용한다는 것입니다. – AlexLordThorsen