복붙노트

[PYTHON] SQLAlchemy에서 튜플 대신 속성 목록 쿼리

PYTHON

SQLAlchemy에서 튜플 대신 속성 목록 쿼리

모델의 ID를 쿼리하고, ID 목록 대신 (int,) 튜플 목록을 얻습니다. 속성을 직접 질의하는 방법이 있습니까?

result = session.query(MyModel.id).all()

나는 그것이 가능하다는 것을 깨닫는다.

results = [r for (r,) in results]

쿼리를 직접 처리하지 않고 해당 폼을 직접 반환 할 수 있습니까?

해결법

  1. ==============================

    1.열과 같은 ORM 계기 설명자를 전달할 때 각 열은 하나의 열에 대해서만 명명 된 튜플입니다. 목록 이해를 위해 열 이름을 사용하여 목록을 '평평하게'만들 수 있습니다 (.all () 호출을 삭제할 수 있으며 반복은 객체를 가져옵니다).

    열과 같은 ORM 계기 설명자를 전달할 때 각 열은 하나의 열에 대해서만 명명 된 튜플입니다. 목록 이해를 위해 열 이름을 사용하여 목록을 '평평하게'만들 수 있습니다 (.all () 호출을 삭제할 수 있으며 반복은 객체를 가져옵니다).

    result = [r.id for r in session.query(MyModel.id)]
    

    또는 for 루프를 반복 할 때 튜플이라는 사실을 사용하여 단일 요소 튜플의 대상에 압축을 풉니 다.

    result = session.query(MyModel.id)
    for id, in result:
        # do something with the id
    

    후자는 또한 목록 이해에 사용될 수 있습니다 :

    [id for id, in session.query(MyModel.id)]
    

    행 결과를 단일 id 값으로 강제로 설정할 수있는 옵션이 없습니다.

  2. ==============================

    2.SQLalchemy가 적절한 해결책을 제공하지 않는다는 것은 이상한 일입니다. sqlalchemy에서 열과 같은 멤버 변수를 선택하면 각 결과는 @Martijn이 말한 바와 같이 명명 된 튜플입니다. 파이썬의 zip 함수를 사용하여 이것을위한 해결책을 찾았습니다.

    SQLalchemy가 적절한 해결책을 제공하지 않는다는 것은 이상한 일입니다. sqlalchemy에서 열과 같은 멤버 변수를 선택하면 각 결과는 @Martijn이 말한 바와 같이 명명 된 튜플입니다. 파이썬의 zip 함수를 사용하여 이것을위한 해결책을 찾았습니다.

    Zip 공식 문서

    당신의보기에 오는

    result = session.query(MyModel.id).all()
    result = zip(*result)[0]
    

    산출:

    [id1, id2, id3...]
    

    그것은 당신이 같은 목록을 전달하는 경우 인수로 주어진 튜플 목록을 평평하게 어떻게 작동합니다

    [(key11, key21), (key12,key22)]
    

    Zip은이 튜플 목록을

    [(key11, key12), (key21, key22)]
    

    귀하의 경우에는 MyModel의 tupe의 모든 초기 값을 원하므로 목록에서 0 번째 튜플을 가져올 수 있습니다.

  3. from https://stackoverflow.com/questions/48466959/query-for-list-of-attribute-instead-of-tuples-in-sqlalchemy by cc-by-sa and MIT license