Programming Language/Python

[SQLAlchemy] 4. ORM을 사용한 INSERT

LeeJaeJun 2024. 6. 22. 14:14
728x90
반응형

ORM을 사용한 INSERT 예제

1. 데이터베이스 엔진 및 베이스 클래스 생성

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase, sessionmaker

# 데이터베이스 엔진 생성
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True)

# 베이스 클래스 생성
class Base(DeclarativeBase):
    pass

2. ORM 매핑 클래스 정의

class User(Base):
    __tablename__ = 'user_account'
    id = Column(Integer, primary_key=True)
    name = Column(String(30))
    fullname = Column(String)

    def __repr__(self):
        return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"

# 데이터베이스 테이블 생성
Base.metadata.create_all(engine)

3. 세션 생성기 생성

SessionLocal = sessionmaker(bind=engine)

4. 데이터 삽입 (add 사용)

# 데이터 삽입
with SessionLocal() as session:
    new_user = User(name='John', fullname='John Doe')
    session.add(new_user)
    session.commit()

 

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, insert, select
from sqlalchemy.orm import declarative_base, sessionmaker, relationship

# 데이터베이스 엔진 생성
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True)

# 베이스 클래스 생성
Base = declarative_base()

# ORM 매핑 클래스 정의
class User(Base):
    __tablename__ = 'user_account'
    id = Column(Integer, primary_key=True)
    name = Column(String(30))
    fullname = Column(String)

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    email_address = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('user_account.id'))
    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

# 데이터베이스 테이블 생성
Base.metadata.create_all(engine)

# 세션 생성기 생성
SessionLocal = sessionmaker(bind=engine)

# 데이터 삽입 - 매개변수화된 쿼리
with SessionLocal() as session:
    new_user = User(name='John', fullname='John Doe')
    session.add(new_user)
    session.commit()

# 데이터 삽입 - 여러 행
with SessionLocal() as session:
    new_users = [
        User(name='Sandy', fullname='Sandy Cheeks'),
        User(name='Patrick', fullname='Patrick Star')
    ]
    session.add_all(new_users)
    session.commit()

# 서브쿼리를 사용하는 복잡한 INSERT
from sqlalchemy.orm import aliased
UserAlias = aliased(User) # 이 예제에서는 꼭 사용할 필요는 없음. SQL구문에서 AS 역할
with SessionLocal() as session:
	# scalar_subquery()는 단일 값을 반환하는 서브쿼리를 생성
    # subquery()는 여러 값을 반환하거나 보다 복잡한 서브쿼리를 작성할 때 사용. 이 경우 from_select를 사용해서 삽입에 이용
    # subquery라는 것을 명시하지 않고 결과만 사용할 수도 있음. 
    # 복잡한 쿼리나 재사용성이 필요한 경우 서브쿼리를 사용하여 명시하는 것이 편리
    subquery = session.query(UserAlias.id).filter(UserAlias.name == 'Sandy').scalar_subquery()
    new_address = Address(email_address='sandy@bikinibottom.com', user_id=subquery)
    session.add(new_address)
    session.commit()

# RETURNING 절
with SessionLocal() as session:
    stmt = (
        insert(User).
        values(name='Squidward', fullname='Squidward Tentacles').
        returning(User.id, User.name) # 반환받고자 하는 columns
    )
    result = session.execute(stmt)
    session.commit()
    print(result.fetchone())

# SELECT를 사용하는 INSERT
with SessionLocal() as session:
    select_stmt = select(User.id, (User.name + "@aol.com").label('email_address'))
    insert_stmt = insert(Address).from_select(['user_id', 'email_address'], select_stmt)
    result = session.execute(insert_stmt)
    session.commit()
728x90
반응형