개요
2025.06.20-[Python] SQLAlchemy - SQL 표현 언어와 메타데이터에서 데이터베이스의 테이블을 나타내는 Table 객체를 생성해 보았다. 이번 글에서는 데이터베이스 내의 테이블을 로드하여 자동으로 Table 객체를 생성하는 테이블 리플렉션에 대해서 적어둔다.
테이블 리플렉션
테이블 리플렉션이랑 데이터베이스의 현재 상태를 읽어 Table과 관련 객체를 생성하는 프로세스를 의미한다. 테이블 객체를 Python으로 선언했던 방식과는 반대로 데이터베이스에서의 DDL을 사용해 Python 내에 데이터 구조를 생성한다.
테이블 리플렉션으로 Table 객체를 생성할 때는 Table 생성자에 autoload_with 매개변수에 create_engine으로 생성한 engine 객체를 전달하면 된다.
Table("TABLE_NAME", metadata_obj, autoload_with=engine)
예시
예시로 아래와 같은 간단한 테이블을 Python Table 객체로 생성해보자.
예시의 테이블은 DEVICENO_TEMP라는 이름의 테이블이고 DEVICE_ID, H_DEVICE_ID라는 문자열 컬럼을 가지고 있다.
from sqlalchemy import MetaData
from sqlalchemy import Table, Column, Integer, String
from sqlalchemy import create_engine
# 메타데이터 객체 생성
metadata_obj = MetaData()
# 데이터베이스 연결
engine = create_engine('mysql+pymysql://thinq_care_mgr:mgr21_thinqcare@rds-an2-thinqcare-stg-mysql.cfgrpqlrctyb.ap-northeast-2.rds.amazonaws.com:3310/thinq_care_kic', echo=True)
# 테이블 리플렉션
table1 = Table('DEVICENO_TEMP', metadata_obj, autoload_with=engine)
table1 객체의 구성 요소를 확인해 보면 다음과 같이 생성된 것을 볼 수 있다.
Table('DEVICENO_TEMP',
MetaData(),
Column('DEVICE_NO', VARCHAR(collation='utf8mb4_general_ci', length=65), table=<DEVICENO_TEMP>, nullable=False, server_default=DefaultClause(<sqlalchemy.sql.elements.TextClause object at 0x000001BD42748220>, for_update=False)),
Column('H_DEVICE_NO', VARCHAR(collation='utf8mb4_general_ci', length=100), table=<DEVICENO_TEMP>),
schema=None)
Column 객체에서 server_default는 DDL의 DEFAULT 키워드에 해당하는 것 같다.
참고 문서
https://docs.sqlalchemy.org/en/20/tutorial/metadata.html#table-reflection
728x90