ORM
Object-Relational Mapper의 약자로 코드와 데이터베이스를 연결해서 사용할 때 하나의 언어로 사용할 수 있도록 기능을 제공합니다
ORM은 코드와 데이터베이스의 중간에서 역할을 수행하며, 코드로 데이터베이스를 실행할 때 ORM이 데이터베이스가 수행되도록 번역을 수행합니다. 반대 상황도 같습니다.
ORM 장단점
장점
- 직접 작성하는 SQL쿼리문은 없고, 더 높은 성능의 SQL 쿼리문들이 작성될 수 있습니다
- 주로 사용하는 언어를 통해 사용이 가능합니다
- 데이터베이스 시스템이 분리 되어있기 때문에 다양한 데이터베이스 서비스를 사용할 수 있습니다
단점
- 데이터베이스와 바로 연결하는 것보다 초기설정이 많고, 복잡해질 가능성이 있습니다
- 내부 작동에 대한 이해가 부족한 경우 문제 발생 시 어려움을 겪을 수 있습니다
- 직접 쿼리문을 작성하는 것이 아니기 때문에 성능저하가 필연적입니다
- 객체지향언어를 사용하는 경우, missmatch에 대한 문제를 고려해야 합니다(메모리주소 값 상이한 경우)
SQLALchemy
파이썬에서 많이 사용되는 ORM중 하나로 다양한 기능을 제공하기 때문에 많이 사용 되고 있습니다.
SQLALchemy는 'Core'와 'ORM'으로 나뉘어져 있고, 'Core'가 데이터베이스 시스템과 상호작용하는 부분입니다
DBAPI
"Python Database API Spectification"의 약어로 DBAPI라고 말하며, 이는 데이터베이스 연결 패키지들 간에 공통된 사용 패턴들을 설립합니다.
데이터베이스 연결
from sqlalchemy import create_engine
engine = create_engine("데이터베이스 주소")
from sqlalchemy.orm import declarative_base
Base = declarative_base()
데이터베이스 정의
from sqlalchemy import Column, Integer, String
class User(Base):
# __tablename__ : 테이블 명
__tablename__ = 'user' # 실제 테이블 명은 소문자로 한다.
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
스키마 생성
Base.metadata.create_all(engine)
테이블 간 관계설정
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(32))
# relationship 추가
addresses = relationship('Address', back_populates='users')
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
country = Column(String(24))
city = Column(String(24))
street = Column(String(64))
user_id = Column(Integer, ForeignKey('user.id'))
# relationship 추가
users = relationship('User', back_populates='addresses')
Session 생성
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
# 혹은
# Session = sessionmaker()
# Session.configure(bind=engine)
session = Session() # 세션 객체 생성
데이터베이스 실제 작업 예시
kimshin = User(name="kimshin", age=38)
session = Session(bind=engine)
session.add(kimshin) # kimshin 객체 추가
session.commit() # 커밋해야, 데이터베이스에 저장됩니다
session.dele(kimshin) # kimshin 객체 제거
session.commit() # 커밋해야, 데이터베이스에 저장됩니다