id비슷한 SQLAlchemy 데이터베이스를 쿼리해야 합니다.
User.query.filter_by (username = 'peter')
하지만 이드를 위해서. 어떻게해야합니까? [Google 및 SO 검색은 도움이되지 않았습니다.]
답변:
Query에는 테이블의 기본 키에 의한 쿼리를 지원 하는 get 함수id 가 있습니다.
예를 들어 ID가 23 인 개체를 쿼리하려면 다음을 수행합니다.
User.query.get(23)
참고 : 몇 가지 다른 댓글 작성자와 답변에서 언급했듯이 이는 단순히 "기본 키에서 쿼리 필터링 수행"의 약어가 아닙니다. SQLAlchemy 세션의 상태에 따라이 코드를 실행하면 데이터베이스를 쿼리하고 새 인스턴스를 반환하거나 실제로 데이터베이스를 쿼리하지 않고 코드에서 이전에 쿼리 한 개체의 인스턴스를 반환 할 수 있습니다. 아직 수행하지 않은 경우 SQLAlchemy 세션 에 대한 문서를 읽고 결과를 이해하는 것이 좋습니다.
YourModel.query.get((pk1, pk2)).. 튜플에 주목하십시오.
다음과 같이 id = 1 인 사용자를 쿼리 할 수 있습니다.
session.query(User).get(1)
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',)
get()결과 객체를 메모리에 제공 하는 것처럼 보이지만 (실제로 데이터베이스를 쿼리하지 않고) filter().first()항상 데이터베이스를 쿼리합니다.
get효율성 증가로 인해 사용하는 것이 좋습니다.
get더 효율적입니다.
먼저 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)