본문 바로가기
프로그래밍 언어

Python - SQLAlchemy 간단 정리

by 내기록 2023. 8. 22.
반응형

목차 LIST

     

    SQLAlchemy

     

    Python에서 사용하는 ORM(Object-relational mapping)이다.

    ORM은 말 그대로 객체(Object)와 관계(Relation)를 연결하는 것으로 데이터베이스 테이블의 데이터를 Object 필드와 매핑한다.

     

    참고) 의존성 역전의 예제로 SQLAlchemy가 사용된다.

    SQLAlchemy를 사용하면 스키마를 별도로 정의하고, 스키마와 도메인 모델을 상호 변환하는 명시적인 매퍼(mapper)를 정의한다. 이렇게 ORM 기능을 사용하면 데이터와 애플리케이션 로직 사이의 강한 의존성을 줄이고, 도메인 모델과 데이터베이스 스키마 사이의 매핑을 추상화하여 의존성 역전 원칙이 적용된다.

     

    장점

    • 객체 지향적인 코드로 비즈니스 로직에 집중할 수 있다.
    • 재사용 및 유지보수 편리성이 증가한다.
    • DBMS에 대한 종속성이 줄어든다.
    • connection pool을 자체적으로 관리해준다. (pool_size, max_overflow 옵션 사용)

    단점

    • ORM만으로 서비스를 구현하기 어렵다.
    • 프로시저가 많은 시스템에서는 장점을 가지기가 어렵다.

     

    참고) 프로시저(Procedure)?
    관계형 데이터베이스 관리 시스템(RDBMS)에서 실행될 일련의 SQL 명령어들을 하나의 함수처럼 정리해놓은 것이다. 프로시져는 데이터베이스 서버에 저장되며, 클라이언트나 다른 프로그램에서 이 프로시져를 호출하여 복잡한 연산이나 작업을 수행할 수 있다.

    CREATE PROCEDURE GetEmployeesAboveSalary(IN min_salary DECIMAL(10,2))
    BEGIN
        SELECT * FROM employees WHERE salary >= min_salary;
    END;
    CALL GetEmployeesAboveSalary(50000);

     

    예시

    movie_module.py

    from sqlalchemy import Column, Integer
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    
    
    class Movie(Base):
        __tablename__ = 'movies'
        id = Column(Integer, primary_key=True)
        date = Column(Integer)
        rank = Column(Integer)
        movieNm = Column(Integer)
        movieCd = Column(Integer)

    - 클래스명이 테이블명이 되지 않는다. 테이블명은 __tablename__으로 정의한다.

     

    test.py

    from sqlalchemy import create_engine
    from movie_module import Movie
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine('sqlite:///db_test.db', echo=True)
    
    Movie.__table__.create(bind=engine, checkfirst=True)
    
    Session = sessionmaker(bind=engine)
    session = Session()
    
    movie_list = Movie(date=20230912,
                       rank=1,
                       movieNm='썸',
                       movieCd=1010)
    
    session.add(movie_list)
    session.commit()

    - 생성한 테이블에 데이터를 처리하려면 sessionmaker를 사용해야 한다.

    - commit()을 사용해서 실제 데이터가 인서트 되도록 한다.

     

    결과

    2023-08-22 22:54:35,631 INFO sqlalchemy.engine.Engine 
    CREATE TABLE movies (
    	id INTEGER NOT NULL, 
    	date INTEGER, 
    	rank INTEGER, 
    	"movieNm" INTEGER, 
    	"movieCd" INTEGER, 
    	PRIMARY KEY (id)
    )
    
    
    2023-08-22 22:54:35,632 INFO sqlalchemy.engine.Engine [no key 0.00029s] ()
    2023-08-22 22:54:35,634 INFO sqlalchemy.engine.Engine COMMIT
    2023-08-22 22:55:20,558 INFO sqlalchemy.engine.Engine BEGIN (implicit)
    2023-08-22 22:55:20,568 INFO sqlalchemy.engine.Engine INSERT INTO movies (date, rank, "movieNm", "movieCd") VALUES (?, ?, ?, ?)
    2023-08-22 22:55:20,569 INFO sqlalchemy.engine.Engine [generated in 0.00082s] (20230912, 1, '썸', 1010)
    2023-08-22 22:55:20,571 INFO sqlalchemy.engine.Engine COMMIT

     

     

     

    References

    https://ulfrid.github.io/python/python-sqlalchemy/

    https://seokhyun2.tistory.com/84

    반응형

    댓글