본문 바로가기
AI월드/⚙️AI BOOTCAMP_Section 3

ORM,SQLAlchemy 기본개념,문법_Day49

by khalidpark 2021. 3. 16.

ORM = Object-Relational Mapping

SQLAlchemy = 파이썬에서 가장 많이 사용되는 ORM

DBAPI = Python Database API Specification

 

설치

pip install --pre sqlalchemy (1.4 베타버전 설치하기위해 , 파이썬3과 호환)

 

데이터베이스와의 연결

from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base


engine=create_engine("데이터베이스 주소")
Base = declarative_base()

예)
engine = create_engine("sqlite:///:memory:")

테이블 생성

만약 SQL로 테이블을 생성한다면

CREATE TABLE user(
     id INTEGER PRIMARY KEY,
     name STRING,
     age INTEGER
)

ORM으로 생성한다면

from sqlalchemy import Column, Integer, String

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

테이블 칼럼

칼럼 이름을 따로 명시해주고 싶을때
random_col = Column('age', Integer)

또는 키워드값으로도 명시가능
random_col = Column(Integer, name='age')

__repr__
class User(Base):
     __tablename__
= "user"
     (... 생략 ...)
     def __repr__(self):
          return f"User {self.id}: {self.name}"

repr : 다음과 같이 인스턴스를 확인할 때 원하는 정보를 볼 수 있기 때문에 유용
Pikachu = User(name='Pikachu', age=30)
print(pikachu) #=> "User 1: Pikachu"

만약에 설정이 되어 있지 않은 경우에는 다음과 같이 표시
print(pikachu) #=> "User(id=None, name="pikachu", age=30)"

스키마 생성

Base.metadata.create_all(engine) #

Base.metadata.drop_all(engine) # 만든 테이블 삭제

Session 생성

ORM 으로 매핑된 객체들을 활용한 지속적 작업을 관리해주는 역할

from sqlalchemy.orm import sessionmaker

session
= sessionmaker(bind=engine)

초기에 엔진을 바인딩하지 않았다면 다음과 같이 설정
session = sessionmaker()
session.configure(bind=engine)

만약에 세션 객체가 엔진이 바인딩이 되어 있지 않은 경우에는 UnboundExecutionError 라는 SQLA 에러

데이터베이스 작업

Create

pikachu = User(name="Pikachu", age=30)

session = Session(bind=engine)
session.add(pikachu)
session.commit() # commit 안하고 종료하면 rollback 발생

Delete

pikachu = session.query(User).filter_by(name='Pikachu').first()
session.delete(pikachu)
session.commit()

조회

pikachu = session.query(User).filter_by(name='Pikachu').first()
print(pikachu.name) #pikachu
print(pikachu.age) #30

변경

pikachu.name = 'kobugi'
print(pikachu.name) #kobugi

Session 종료

세션을 종료하게 되면 따로 롤백 함수를 실행하지 않아도 알아서 롤백 해줌. 편리


Google Colab sqlalchemy doc

colab.research.google.com/github/aviadr1/learn-advanced-python/blob/master/content/11_db_access/02_sqlalchemy_orm.ipynb#scrollTo=84Xl2ORExNaj

 

Google Colaboratory

 

colab.research.google.com

 

 

이미지 출처 : files.realpython.com/media/Python-and-Sqlite-and-SqlAlchemy-Oh-My_Watermarked.11096d6ed0d9.jpg

이미지 출처 : cdn.educba.com/academy/wp-content/uploads/2020/01/what-is-orm.jpg

728x90

댓글