2010-05-13 5 views
7

SQLAlchemy를 0.6으로 업데이트했지만 모든 것이 손상되었습니다. 더 이상 튜플이 아닌 사전을 반환하는 것으로 나타났습니다. 다음은 샘플 쿼리입니다.SQLAlchemy가 사전이 아닌 튜플을 반환합니다.

query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1) 
result = session.execute(query).fetchone() 

0.5로 사전을 반환하는 데 사용되는이 코드는 다음과 같습니다.

제 질문은 어떻게 사전을 반환 할 수 있습니까?

+2

그냥 궁금 : 당신은 DICT 원하는 경우는 키를 사용하여 튜플 우편 번호는'session.query (사용자) 갔지 (ID)를 '하지 않는 이유를 (User.id을 가정하는 것은 기본 키) . id가 기본 키가 아닌 경우'session.query (User) .filter (User.id == id) .filter (User.username == username) .first()' 그렇게하면 User 인스턴스가 반환되고 속성 조회를 통해 필드 값에 액세스 할 수 있습니다. – codeape

답변

5

이 작업은 다음과 같습니다. dict(zip(['id','username','email'],result)) (또는 Python 3.x를 사용하는 경우 사전 독해력을 사용할 수 있습니다.)
또한 session.query 개체에 session.execute을 호출 할 필요가 없습니다. 대신 .one() 메서드를 사용하는 것이 좋습니다. 이렇게하면 쿼리가 끝날 때까지 전화가 끊어 질 필요가 없습니다.

+0

예, 작동합니다. 감사. SQLALchemy가이 코드에 대해 생성 한 SQL 문을 볼 때 LIMIT 1을 쿼리에 포함시키지 않기 때문에 limit (1)을 사용합니다. – Ivan

8

인쇄 할 때 터플 인 것처럼 보이는 ResultProxy이 아닌가요? ORM에있는 많은 객체들은 그들의 __str__ 함수가 반환하는 객체가 아닙니다.

+0

+1 나는 이것을 읽을 때까지 내가보고 있었던 것에 완전히 눈이 멀었다. 읽은 후, 나는 그냥 가서 필드 이름을 사용해 보았는데 완벽하게 작동했습니다! 나에게 많은 두통을 덜어 줬다. 감사. –

33

session.execute가 딕셔너리를 반환 적이있다, 그것은 위치 조회에 대한 정수 키를 사용하여 사전인가처럼 를 색인 할 수있는 RowProxy 객체를 반환 문자열 키는 라벨의 값을 조회하는 조회 업 또는 열 객체를 기반으로 그 칼럼의 여기서 문제는 session.execute(query)이 예상 한대로 작동하지 않는다는 것입니다. Query 오브젝트를 Select 문으로 변환하고,이를 실행하고 결과를 직접 리턴합니다. 결과 집합은 ORM 수준 기능에 대해 아무 것도 모릅니다. 0.5 광고 0.6 사이에서 변경된 점은 ORM이 다른 알고리즘을 사용하여 쿼리의 열을 레이블링한다는 것입니다. 이제 테이블 이름이 레이블 앞에 추가됩니다. 따라서 이전에 row['id']이 작동했을 때, 현재 row['users_id']이 작동합니다. 두 경우 모두 row[User.__table__.columns['id']]이 작동합니다.

ORM 쿼리를 실행하려면 실제로 .all(), .first().one() 메서드를 사용하거나 반복하거나 숫자 인덱싱을 사용해야합니다. 쿼리는 이름이 지정된 튜플 객체를 반환합니다.

row = session.query(User.id, User.username, User.email)\ 
    .filter(and_(User.id == id, User.username == username)).first() 
print("id=%s username=%s email=%s" % row) # positional 
print(row.id, row.username) # by label 
print(dict(zip(row.keys(), row))) # as a dict 
관련 문제