SqlAlchemy를 사용하여 ID로 데이터베이스를 쿼리하는 방법은 무엇입니까?


95

id비슷한 SQLAlchemy 데이터베이스를 쿼리해야 합니다.

User.query.filter_by (username = 'peter')

하지만 이드를 위해서. 어떻게해야합니까? [Google 및 SO 검색은 도움이되지 않았습니다.]


동등한 SQL 또는 원하는 작업을 수행하는 의사 코드와 같은 자세한 정보를 제공하십시오. "SQLAlchemy 데이터베이스 ID"는 무엇입니까?
Daniel Kluev 2011

테이블에 ID 열이 있습니까?
키스

답변:


130

Query에는 테이블의 기본 키에 의한 쿼리를 지원 하는 get 함수id 가 있습니다.

예를 들어 ID가 23 인 개체를 쿼리하려면 다음을 수행합니다.

User.query.get(23)

참고 : 몇 가지 다른 댓글 작성자와 답변에서 언급했듯이 이는 단순히 "기본 키에서 쿼리 필터링 수행"의 약어가 아닙니다. SQLAlchemy 세션의 상태에 따라이 코드를 실행하면 데이터베이스를 쿼리하고 새 인스턴스를 반환하거나 실제로 데이터베이스를 쿼리하지 않고 코드에서 이전에 쿼리 한 개체의 인스턴스를 반환 할 수 있습니다. 아직 수행하지 않은 경우 SQLAlchemy 세션 에 대한 문서를 읽고 결과를 이해하는 것이 좋습니다.


8
Get 함수는 여러 기본 키도 지원합니다 YourModel.query.get((pk1, pk2)).. 튜플에 주목하십시오.
marc_aragones

3
get()함수는 기본 키로 개체를 쿼리합니다. 으로 쿼리 id하려면 id먼저 기본 키로 설정해야합니다 .

46

다음과 같이 id = 1 인 사용자를 쿼리 할 수 ​​있습니다.

session.query(User).get(1)


7

get ()은 때때로 예상대로되지 않습니다.

거래가 완료된 경우 :

>>> session.query(User).get(1)
[SQL]: BEGIN (implicit)
[SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
FROM user
WHERE user.id = ?
[SQL]: (1,)
<User(u'ed', u'Ed Jones')>

트랜잭션에있는 경우 (get ()은 데이터베이스를 쿼리하지 않고 메모리에 결과 객체를 제공합니다) :

>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>

이것을 사용하는 것이 더 좋습니다.

>>> session.query(User.name).filter(User.id == 1).first()
[SQL]: SELECT user.name AS user_name
FROM user
WHERE user.id = ?
 LIMIT ? OFFSET ?
[SQL]: (1, 1, 0)
(u'Edwardo',)

1
이 동작이 어떻게 예상치 못한 것입니까?
Solomon Ucko

내 말은 트랜잭션 (아직 session.commit이 아님)에서 get()결과 객체를 메모리에 제공 하는 것처럼 보이지만 (실제로 데이터베이스를 쿼리하지 않고) filter().first()항상 데이터베이스를 쿼리합니다.
panda912

트랜잭션 중에 데이터베이스를 동시에 변경할 수 있습니까? 그렇지 않은 경우 get효율성 증가로 인해 사용하는 것이 좋습니다.
Solomon Ucko 2018

1
내가 알고 있듯이 sqlalchemy는 비동기 물건으로 작업 할 수 없으며 (gevent에서만 보임) 예, get더 효율적입니다.
panda912

트랜잭션에 관한 한 .first ()가 .get ()과 다른 이유는 무엇입니까? .first ()는 항상 데이터베이스로 돌아 갑니까? .get ()이 해당 ID 또는 무언가를 알고 있는지 확인하기 위해 현재 환경에서 먼저 확인합니까?
msouth

1

사용하는 경우 tables reflection제공된 솔루션에 문제가있을 수 있습니다. (여기의 이전 솔루션은 저에게 효과적이지 않았습니다).

내가 사용한 것은 다음과 같습니다.

session.query(object._class_).get(id)

( object데이터베이스에서 리플렉션에 의해 검색되었으므로 사용해야하는 이유입니다. .__class__)

이게 도움이 되길 바란다.


0

먼저 id기본 키로 설정해야 합니다.
그런 다음이 query.get()메서드를 사용하여 id이미 기본 키인 개체를 쿼리 할 수 있습니다 .

query.get()기본 키로 개체를 쿼리 하는 방법 이후 . Flask-SQLAlchemy 설명서
에서 유추

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

def test():
    id = 1
    user = User.query.get(id)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.