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
반응형
'Programming Language > Python' 카테고리의 다른 글
[SQLAlchemy] 6. ORM을 사용한 UPDATE (0) | 2024.06.22 |
---|---|
[SQLAlchemy] 5. ORM을 사용한 SELECT (0) | 2024.06.22 |
[SQLAlchemy] 3. MetaData (0) | 2024.06.22 |
[SQLAlchemy] 2. Connection, Commit, Query, Bound parameters (0) | 2024.06.22 |
[SQLAlchemy] 1. Engine (0) | 2024.06.22 |