9/17 SQLAlchemy · NumPy

레롤롤레로·2026년 9월 17일

랭체인AI

목록 보기
7/20

오늘은 SQLAlchemy로 멜론 순위 데이터를 DB에 넣는 과제를 진행하고, NumPy 기초를 배웠다. 어제 회원 데이터로 다룬 CRUD를 CSV 데이터에 적용한 뒤, 배열의 값과 구조를 확인하는 실습으로 이어졌다.

CSV 데이터를 테이블에 담기

SQLAlchemy 과제는 melon_rank.csv를 읽어 melons 테이블에 저장하는 작업이었다. 순위, 곡 제목, 가수, 앨범 표지 주소, 좋아요 수를 가져왔다.

t = (
    int(row['순위'].replace("위", "")),
    row['곡제목'],
    row['가수'],
    row['앨범표지'],
    int(row['좋아요수']) if row['좋아요수'] else 0
)

순위는 위를 제거하고 정수로 바꿨다. 좋아요 수도 정수로 변환하되, 빈 값이면 0을 넣었다.

테이블에는 자동 증가하는 id를 기본 키로 두고, 순위에는 중복을 허용하지 않도록 설정했다. 각 행은 Pydantic의 MelonVO로 만들어 타입을 검증한 뒤 저장할 데이터로 변환했다.

여러 행을 한 번에 추가하기

입력받은 VO 목록을 딕셔너리 목록으로 바꾸고 insert(Melon).values()에 전달했다.

new_melons = [
    melon.model_dump(exclude_none=True)
    for melon in melons
]

query = (
    insert(Melon)
    .values(new_melons)
    .returning(Melon.id)
)

result = await session.execute(query)
await session.commit()

created_len = len(result.all())
return len(new_melons) == created_len

추가된 ID 개수와 입력 데이터 개수를 비교하도록 작성했고, 노트북에는 insert complete가 출력됐다. 실행 중 예외가 발생하면 rollback()을 호출하는 처리도 넣었다.

저장한 데이터 조회·수정·삭제

데이터를 넣은 뒤에는 과제 순서대로 전체 조회, ID가 5인 데이터 조회, ID가 3인 데이터의 제목 수정, ID가 1인 데이터 삭제를 진행했다.

전체 조회는 scalars().all(), 단건 조회는 scalar_one_or_none()을 사용했다. 조회 결과는 다시 MelonVO로 변환했다.

query = select(Melon).where(Melon.id == id)
result = await session.execute(query)
found_melon = result.scalar_one_or_none()

if found_melon:
    found_melon = MelonVO.model_validate(found_melon)

수정은 ID가 3인 데이터를 먼저 조회한 뒤 제목을 룰루랄라로 바꾸고 업데이트 함수에 전달했다. 실행 결과에는 update complete와 delete complete가 남았다.

여기서 조회 기준으로 사용한 값은 곡의 순위인 melon_rank가 아니라 기본 키인 id다. 두 값이 같아 보이더라도 코드에서 어떤 컬럼을 조건으로 쓰는지 구분해야 한다.

NumPy 배열 만들기

이후에는 NumPy를 시작했다. 리스트를 np.array()에 전달해 배열을 만들고 값을 확인했다.

arr1 = np.array([1, 2, 3])

숫자, 불리언, 문자열을 함께 넣은 예제에서는 모든 값이 문자열로 표현됐다.

arr3 = np.array([1, 2, False, "홍길동", 12.5])

# array(['1', '2', 'False', '홍길동', '12.5'], dtype='<U32')

입력값을 섞었을 때 결과의 자료형이 어떻게 바뀌는지도 확인했다. 정수 배열에서 꺼낸 값의 타입은 이번 실행 환경에서 numpy.int64였고, int()로 변환하면 Python의 int가 됐다.

인덱싱과 슬라이싱은 리스트에서 사용하던 형태로 연습했다.

arr3 = np.array([i + 1 for i in range(10)])

print(arr3[2:5])    # [3 4 5]
print(arr3[1:8:2])  # [2 4 6 8]

값뿐 아니라 배열의 모양 보기

오늘은 1차원부터 3차원까지 배열을 만들고 shape, ndim, size를 비교했다.

실습에서 만든 arr7의 결과는 다음과 같았다.

속성결과의미
arr7.shape(2, 3, 4)각 축의 길이
arr7.ndim3배열의 차원 수
arr7.size24전체 원소 수

이 배열은 3행 4열 묶음이 2개 있는 구조였다. arr7[1][0][2]로 접근했을 때는 두 번째 묶음의 첫 행, 세 번째 값인 300이 나왔다.

다음에 다시 볼 부분

SQLAlchemy에서는 CSV 한 행이 VO를 거쳐 DB에 저장되고, 조회 결과가 다시 VO로 돌아오는 과정을 연습했다. NumPy에서는 배열의 값뿐 아니라 자료형과 차원도 함께 확인했다.

DB 수정 함수는 현재 VO 전체를 전달하고 있어, 기본 키와 실제로 바꿀 필드를 분리하는 부분을 다시 살펴볼 예정이다. NumPy는 다차원 배열의 shape를 보고 원하는 값의 위치를 찾는 연습을 더 해보려고 한다.

0개의 댓글