>  기사  >  백엔드 개발  >  Python 웹 개발의 SQLAlchemy 팁

Python 웹 개발의 SQLAlchemy 팁

PHPz
PHPz원래의
2023-06-17 12:03:111653검색

인터넷 기술의 지속적인 발전으로 Python 웹 개발이 점차 온라인에서 대중화되고 있습니다. SQLAlchemy는 Python에서 가장 널리 사용되는 ORM(Object-Relational Mapping) 프레임워크 중 하나입니다. 이 프레임워크가 제공하는 효율적이고 간단한 데이터베이스 작업 방법은 Python 웹 개발과 데이터베이스 간의 원활한 연결을 실현할 뿐만 아니라 많은 개발자에게 선호됩니다. 이 기사에서는 개발자가 프로젝트 개발을 보다 효율적으로 완료하는 데 도움이 되도록 Python 웹 개발의 일부 SQLAlchemy 기술을 공유합니다.

1. contextlib를 사용하여 세션 종료를 보장하세요

ORM 프레임워크에는 일반적으로 Session 개체가 포함됩니다. 개발자가 데이터베이스와 상호 작용해야 할 경우 세션 개체를 생성하여 동작하게 되는데, 동작이 완료된 후 세션 개체를 닫아야 하며, 그렇지 않으면 예상치 못한 문제가 발생할 수 있습니다.

세션 개체 관리를 보장하기 위해 Python은 contextlib 컨텍스트를 사용하여 시스템 속성을 일시적으로 수정할 수 있습니다. contextlib를 사용하면 지나치게 번거로운 시도/제외 처리를 피하면서 세션이 닫히는 것을 확인할 수 있습니다. 코드는 다음과 같습니다.

from contextlib import contextmanager
from sqlalchemy.orm import sessionmaker

engine = create_engine(DB_URL)
Session = sessionmaker(bind=engine)

@contextmanager
def session_scope():
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

위 코드는 session_scope 컨텍스트 관리자를 생성하고 SQLAlchemy의 세션 개체를 운영합니다. 실제 개발에서는 with 구문 블록을 사용하여 세션 생성 및 소멸을 자동으로 관리할 수 있습니다.

# 使用with自动管理session的创建与销毁
with session_scope() as session:
    # 实现对数据库的操作

2. 효율적인 쿼리를 위해 쿼리 개체 사용

SQLAlchemy의 쿼리 API는 프로그래밍 방식으로 데이터베이스를 쿼리하는 방법을 제공합니다. Query API에는 개발자가 쿼리 조건을 빠르고 쉽게 정의하는 데 도움이 되는 강력한 필터링, 그룹화, 정렬 및 기타 기능이 있습니다.

Query Objects는 Query의 반환 값이며 SQLAlchemy 고유의 데이터 유형입니다. 쿼리 개체는 체인 구조이며, 메서드 체인을 추가하여 쿼리 문을 작성할 수 있습니다. 쿼리 개체는 여러 곳에서 재사용할 수 있는 "쿼리 템플릿"으로 사용할 수 있으므로 여러 유사한 쿼리에 대한 코드 중복을 피할 수 있습니다.

# 查询books表中价格高于50的所有图书
books = session.query(Book).filter(Book.price > 50).all()

복잡한 쿼리의 경우 여러 방법을 사용하여 쿼리를 작성할 수 있습니다. 다음 예에서는 쿼리 개체의 체인 구조를 사용하여 쿼리 그룹화, 정렬 및 제한을 구현하는 방법을 보여줍니다.

# 查询books表中,数量大于0,价格低于100元的所有书籍分页显示
books_query = session.query(Book).filter(Book.stock > 0).filter(Book.price < 100)
books_query = books_query.order_by(Book.price.desc())
books_query = books_query.limit(20).offset(0)
books = books_query.all()

쿼리 개체는 count(), first() 등과 같은 다른 많은 쿼리 메서드도 지원합니다. Query API 문서를 통해 볼 수 있습니다.

3. 성능 최적화를 위해 Laziness를 사용하세요

쿼리 개체를 사용하여 대량의 데이터를 쿼리할 때 데이터베이스 부하를 줄이고 쿼리 효율성을 높이기 위해 Laziness 지연 로딩을 사용해야 하는 경우가 있습니다. 게으름은 각 쿼리 후에 즉시 결과를 얻는 것이 아니라 데이터를 사용해야 할 때 데이터를 쿼리하는 것을 의미합니다.

Laziness를 사용하는 방법은 다음과 같습니다.

# 查询users表中用户名以A开头的所有用户的ID
def get_user_ids(startswith):
    query = session.query(User.id).filter(User.username.startswith("A"))
    return query

위 코드는 목록이 아닌 쿼리 개체 개체를 반환합니다.

이 방법을 사용하면 모든 결과를 가져오기 전에 전체 결과 집합을 쿼리하고 저장하지 않아도 됩니다. 쿼리를 작은 배치로 나누고 필요할 때만 데이터를 로드합니다. 이는 데이터베이스 쿼리 시 컴퓨터의 부담을 줄이고 Python 웹 개발의 효율성을 향상시킬 수 있습니다.

4. 하이브리드 속성을 사용하여 자동 계산

Python 웹 개발에서 동시에 여러 테이블에 대한 쿼리를 처리하려면 일반적으로 데이터를 얻기 위해 많은 쿼리 문을 작성해야 합니다. 하이브리드 속성은 자동 계산 및 집계를 통해 다중 테이블 관계를 처리하는 방법을 제공합니다.

다음은 하이브리드 속성을 사용하는 코드 예제입니다.

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer(), primary_key=True)
    name = Column(String(255), nullable=False)
    messages = relationship('Message')

    @hybrid_property
    def num_messages(self):
        return len(self.messages)

    @num_messages.expression
    def num_messages(cls):
        return (
            select([func.count(Message.id)])
            .where(cls.id == Message.user_id)
            .label("num_messages")
        )

이 예제에서 num_messages는 사용자가 보유한 메시지 수를 자동으로 계산할 수 있습니다. 쿼리 API는 이 속성을 데이터베이스 스키마의 필드인 것처럼 사용할 수 있습니다. 그리고 다른 일반 속성처럼 쿼리하고 필터링할 수 있습니다. num_messages는 하이브리드 속성의 특성을 사용하고 두 가지 정의를 사용합니다. 하나는 순수 Python 정의 데코레이터이고 다른 하나는 SQLalchemy 표현식 정의입니다.

요컨대 Python 웹 개발에서 데이터베이스 작업에 SQLAlchemy를 사용하면 개발자가 데이터베이스 작업을 보다 우아하게 수행하고 개발 효율성을 향상시킬 수 있습니다. 이 기사에서는 독자에게 도움이 되기를 바라며 Python 웹 개발의 일부 SQLAlchemy 기술을 소개합니다. 다양한 상황에서 작업 중복을 피하고 Python 웹 개발을 보다 효율적으로 만들기 위해 SQLAlchemy에서 제공하는 풍부한 API를 최대한 활용해야 합니다.

위 내용은 Python 웹 개발의 SQLAlchemy 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.