Flask SQLAlchemy 쿼리, 열 이름 지정


125

모델을 사용하여 쿼리에서 원하는 열을 지정하려면 어떻게합니까 (기본적으로 모든 열을 선택 함)? sqlalchmey session :으로이 작업을 수행하는 방법을 알고 session.query(self.col1)있지만 모델에서는 어떻게 수행합니까? 나는 할 수 없다 SomeModel.query(). 방법이 있습니까?

답변:


220

with_entities()메서드를 사용 하여 결과에 반환 할 열을 제한 할 수 있습니다 . ( 문서 )

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

요구 사항에 따라 지연이 유용 할 수도 있습니다 . 이를 통해 전체 객체를 반환 할 수 있지만 와이어로 오는 열을 제한합니다.


21
with_entities ()는 all ()이 객체가 아닌 열 값의 튜플을 생성하도록합니다!
kolypto 2014 년

10
kolypto : 그것은 당신이 양보를 요구하는 모든 것을 산출합니다. SomeModel.query.with_entities (SomeModel)는 객체를 생성합니다. session.query (SomeModel.col1, SomeModel.col2)와 마찬가지로 열 값의 튜플을 생성합니다. Deferred는 열이 와이어로 전달되는 것을 원하지 않지만 어쨌든 전체 개체를 원할 경우 사용하는 것입니다.
David McKeone 2014

2
감사합니다. 하지만 필드에 별칭을 어떻게 할당 할 수 있습니까? 내 경우에는 내가 가입과 충돌 사용하고 있기 때문에 ID두 테이블에 존재하는 필드
Mitul 샤

예, @MitulShah와 동일한 질문이 있습니다. 별칭을 설정하는 방법은 무엇입니까?
Nam G VU

별칭의 경우 아래의 간단한 답변을 참조하십시오. .label() stackoverflow.com/a/11535992/248616
Nam G VU

69
session.query().with_entities(SomeModel.col1)

와 같다

session.query(SomeModel.col1)

별칭의 경우 .label ()을 사용할 수 있습니다.

session.query(SomeModel.col1.label('some alias name'))

2
승리 / 승리 - 모두 소리를 더 논리적이고 두 번째는 짧은
fgblomqvist

7
첫 번째 진술이 잘못되었습니다. 괄호가 필요합니다. 따라서 읽어야합니다.session.query().with_entities(SomeModel.col1)
JGFMK

특히 여러 복잡한 하위 쿼리를 수행하는 경우 기존 쿼리 개체를 재사용하려는 경우 첫 번째 (및 세 번째) 옵션이 가장 좋습니다.
Jamie Strauss

36

load_only 함수 를 사용할 수 있습니다 .

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()

1
이 솔루션은 결과 목록뿐만 아니라 Object로 여전히 작동하므로 최상의 솔루션입니다.
rborodinov

이 솔루션에 대한 찬사입니다. 다음과 같은 많은 이점이 있습니다.- .first().one()(지연 / 간단로드 필드 및 관계)와 정확히 동일한 유형의 개체를 반환합니다 .-쿼리 구성 요소로 설정할 수 있습니다.
Damien

코드는 깨끗하지만 SQL 쿼리는 데이터베이스에서 모든 필드를 선택합니다. 나는 with_entities받아 들여진 대답에 주어진대로 사용 했으며 쿼리는 해당 필드 만 선택했습니다.
Srikanth Jeeva

11

당신은 사용할 수 있습니다 Model.query때문에, Model(선언 확장자를 사용하는 특히 경우 또는 일반적으로 기본 클래스가) 지정됩니다 Sesssion.query_property. 이 경우는 Model.query동일하다 Session.query(Model).

쿼리에서 반환 된 열을 수정하는 방법을 모르겠습니다 (를 사용하여 더 추가하는 경우 제외 add_columns()).
따라서 가장 좋은 방법은 Session.query(Model.col1, Model.col2, ...)(Salil이 이미 보여준 것처럼 )를 사용하는 것 입니다.


쿼리 값 ()에 대한 열 목록 ( docs.sqlalchemy.org/en/latest/orm/… )을 사용하여이 작업을 수행하는 방법도있을 수 있다고 생각합니다. 그러나 목록의 구문 설탕은 현재 저를 피합니다.
JGFMK


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.