Programming Language/Python

[SQLAlchemy] 5. ORM을 사용한 SELECT

LeeJaeJun 2024. 6. 22. 15:03
728x90
반응형

SELECT 구문 실행

stmt = select(user_table).where(user_table.c.name == "spongebob")

# Core 방식
with engine.connect() as conn:
    for row in conn.execute(stmt):
        print(row)

# ORM 방식
stmt = select(User).where(User.name == "spongebob")
with Session(engine) as session:
    for row in session.execute(stmt):
        print(row)

 

select() 함수

  • 여러 개의 컬럼과 테이블을 받아서 SELECT 쿼리를 구성
stmt = select(user_table)
# SELECT * FROM user_account
  • where(): 조건을 하나 또는 여러 개 지정
stmt = select(user_table).where(user_table.c.name == 'spongebob')
# SELECT * FROM user_account WHERE name = 'spongebob
  • order_by(): 정렬 기준을 지정(기본적으로 오름차순)
# 오름차순
stmt = select(user_table).order_by(user_table.c.name)
# SELECT * FROM user_table ORDER BY name

# 내림차순
stmt = select(user_table).order_by(desc(user_table.c.name))
# SELECT * FROM user_table ORDER BY name DESC

# 여러 기준
select(user_table).order_by(desc(user_table.c.name), user_table.c.fullname)
# SELECT * FROM user_table ORDER BY name DESC, fullname
  • group_by(): 그룹화
select(user_table.c.name, func.count(user_table.c.id)).group_by(user_table.c.name)
# SELECT name, COUNT(id) FROM user_table GROUP BY name
  • having(): 그룹화 조건
stmt = select(user_table.c.name, func.count(user_table.c.id)).group_by(user_table.c.name).having(func.count(user_table.c.id) > 1)
# SELECT name, COUNT(id) FROM user_table GROUP BY name HAVING COUNT(id) > 1
  • scalar_subquery: SQL 쿼리를 서브쿼리로 변환하여 단일 값(스칼라 값)을 반환하는 역할
subq = select(func.count(address_table.c.id)).where(user_table.c.id == address_table.c.user_id).scalar_subquery()
stmt = select(user_table.c.name, subq.label("address_count"))
"""
 SELECT user_account.name, 
       (SELECT count(address.id) 
        FROM address 
        WHERE user_account.id = address.user_id) AS address_count)
FROM user_account
"""
  • join: 조인할 테이블을 지정하고, ON 절을 자동으로 추론하거나 직접 제공하여 조인을 수행. (주로 단순한 join에 사용)
stmt = select(user_table.c.name, address_table.c.email_address).join(address_table, user_table.c.id == address_table.c.user_id)
"""
SELECT user_account.name, address.email_address
FROM user_account
JOIN address ON user_account.id = address.user_id
"""
  • from_join: 명시적으로 조인 조건을 지정하는 데 사용 (복잡한 join 조건을 명확하게 정의)
stmt = select(user_table.c.name, address_table.c.email_address).join_from(user_table, address_table, user_table.c.id == address_table.c.user_id)
"""
SELECT user_account.name, address.email_address 
FROM user_account 
JOIN address ON user_account.id = address.user_id
"""
  • select_from(): SELECT 문에서 사용되는 기본 테이블을 지정하는 데 사용 (명확하게 테이블 지정)
stmt = select(address_table.c.email_address).select_from(user_table).join(address_table)
"""
SELECT address.email_address 
FROM user_account 
JOIN address ON user_account.id = address.user_id
"""
  • distinct(): SQL의 DISTINCT 구문을 생성하여 중복된 결과를 제거
stmt = select(user_table.c.name).distinct()
# SELECT DISTINCT name FROM user_account
  • limit(), offset():  쿼리 결과에서 몇 개의 행을 건너뛰어서 몇 개의 결과를 나타낼지
stmt = select(user_table).limit(10).offset(5)
# SELECT * FROM user_account LIMIT 10 OFFSET 5
# 6번째 행부터 시작해서 10개의 행 반환
  • union(), union_all(), intersect(), except_(): SQL 집합연산자 생성
stmt1 = select(user_table).where(user_table.c.name == "spongebob")
stmt2 = select(user_table).where(user_table.c.name == "patrick")
u = union(stmt1, stmt2)
"""
SELECT * FROM user_account 
WHERE name = 'spongebob' 
UNION 
SELECT * FROM user_account 
WHERE name = 'patrick
"""
728x90
반응형