파이썬 - 데이터베이스 접근

안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 파이썬을 사용하여 데이터베이스에 접근하는 이 흥미로운 여정에서 여러분의 가이드가 되어 기쁩니다. 여러년간 프로그래밍을 가르치며 있었던 저는 이 기술이 단순히 필수적인 것 이상, 매우 강력한 것이라고 확신합니다. 그럼, 파이썬을 사용한 데이터베이스 조작의 비밀을 열어보겠습니다!

Python - Database Access

파이썬에서 데이터베이스 접근

큰 도서관을 정리하는 것을 상상해보세요. 여러분은 수천권의 책을 가지고 있고, 이를 모두 추적하기 위한 시스템이 필요합니다. 이는 데이터베이스가 디지털 정보를 처리하는 방식과 매우 유사합니다. 파이썬은 다양한 언어로, 데이터베이스와 상호작용하는 여러 가지 방법을 제공합니다. 오늘은 두 가지 인기 있는 방법에 중점을 두겠습니다: sqlite3 모듈을 사용하여 SQLite 데이터베이스와 PyMySQL 모듈을 사용하여 MySQL 데이터베이스를 다루는 방법입니다.

sqlite3 모듈

SQLite는 파이썬과 함께 내장된 마치 작은 데이터베이스입니다. 작은 애플리케이션이나 처음 시작할 때에는 완벽합니다. 모듈을 임포트하여 시작해보겠습니다:

import sqlite3

이 줄은 파이썬에게 "SQLite 데이터베이스로 작업할 것이니 준비해라!"라고 말하는 것과 같습니다.

연결 객체

데이터베이스로 작업하기 위해서는 먼저 데이터베이스에 연결해야 합니다. 이는 디지털 도서관의 문을 노크하는 것과 같습니다. 이렇게 하면 됩니다:

conn = sqlite3common("example.db")

이 줄은 "example.db"라는 새로운 데이터베이스 파일을 생성하거나, 이미 존재하면 엽니다. conn 변수는 이 데이터베이스에 대한 우리의 키입니다.

커서 객체

이제 우리는 디지털 도서관 안에 들어왔습니다. 이 안으로 이동하고 물리적으로 조작할 방법이 필요합니다. 이는 커서가 수행하는 작업입니다. 하나를 만들어보겠습니다:

cursor = conn.cursor()

커서는 여러분의 도서관 어시스턴트처럼, 여러분의 명령에 따라 정보를 가져오거나 수정할 준비가 되어 있습니다.

데이터베이스 테이블 생성

어떤 정보를 저장할 테이블을 생성해보겠습니다. 책들을 카탈로그화하는 것을 상상해보세요:

cursor.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY,
title TEXT,
author TEXT,
year INTEGER)''')

이 SQL 명령은 "books"라는 이름의 테이블을 생성합니다. 컬럼은 id, title, author, year이 있습니다. IF NOT EXISTS 부분은 우리가 실수로 중복 테이블을 생성하지 않도록 합니다.

INSERT 연산

이제 데이터베이스에 몇 가지 책을 추가해보겠습니다:

cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("To Kill a Mockingbird", "Harper Lee", 1960))
conn.commit()

이렇게 하면 새로운 책을 우리의 테이블에 삽입합니다. ? 기호는 우리의 데이터를 위한 자리표시자로, SQL 인젝션 공격을 방지하는 데 도움이 됩니다 (다른 날에 다시 설명할 주제입니다!). commit() 메서드는 우리의 변경 사항을 저장합니다.

READ 연산

데이터를 검색해보겠습니다:

cursor.execute("SELECT * FROM books")
books = cursor.fetchall()
for book in books:
print(f"ID: {book[0]}, Title: {book[1]}, Author: {book[2]}, Year: {book[3]}")

이렇게 하면 모든 책을 가져오고 인쇄합니다. 이는 우리의 도서관 어시스턴트에게 우리가 가지고 있는 모든 책을 보여달라고 요청하는 것과 같습니다.

Update 연산

정보를 수정해야 하나요? 문제ありません:

cursor.execute("UPDATE books SET year = ? WHERE title = ?", (1925, "The Great Gatsby"))
conn.commit()

이렇게 하면 "The Great Gatsby"의 출판 연도를 업데이트합니다. 항상 변경 사항을 커밋하지 않는 것을 잊지 마세요!

DELETE 연산

때로는 항목을 제거해야 합니다:

cursor.execute("DELETE FROM books WHERE author = ?", ("J.K. Rowling",))
conn.commit()

이렇게 하면 J.K. Rowling의 모든 책을 데이터베이스에서 제거합니다. DELETE 연산을 주의 깊게 사용하세요 - 데이터베이스에 어두 버튼이 없습니다!

트랜잭션 수행

트랜잭션은 작업을 그룹화하는 방법입니다. 어떤 작업이 실패하면, 모든 작업이 취소됩니다. "모두 또는 아무 것도 아님" 접근 방식입니다:

try:
conn.execute("BEGIN TRANSACTION")
cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("1984", "George Orwell", 1949))
cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("Animal Farm", "George Orwell", 1945))
conn.commit()
print("Transaction successful!")
except sqlite3.Error as e:
conn.rollback()
print(f"An error occurred: {e}")

COMMIT 연산

예제에서 commit()을 사용했습니다. 이는 데이터베이스에 우리의 변경 사항을 저장하는 데 중요합니다. 이를 사용하지 않으면, 연결을 닫을 때 변경 사항이 손실될 수 있습니다.

ROLLBACK 연산

트랜잭션 중에 что가 잘못되면, rollback()을 사용하여 마지막 커밋 이후의 모든 변경 사항을 되돌릴 수 있습니다:

try:
# 데이터베이스 작업
conn.commit()
except sqlite3.Error:
conn.rollback()

PyMySQL 모듈

SQLite는 학습하고 작은 애플리케이션에는 좋지만, 많은 실제 프로젝트는 더 강력한 데이터베이스를 사용합니다. PyMySQL를 사용하는 방법을 간단히 살펴보겠습니다:

import pymysql

conn = pymysql.connect(host='localhost',
user='your_username',
password='your_password',
database='your_database')

try:
with conn.cursor() as cursor:
sql = "INSERT INTO users (email, password) VALUES (%s, %s)"
cursor.execute(sql, ('[email protected]', 'very-secret'))
conn.commit()
finally:
conn.close()

기본 원리는 SQLite와 유사하지만, PyMySQL는 원격 MySQL 데이터베이스에 연결할 수 있습니다.

오류 처리

데이터베이스 작업 시 오류 처리는 중요합니다. 항상 try-except 블록을 사용하여 잠재적인 오류를 캐치하고 처리하십시오:

try:
# 데이터베이스 작업
except sqlite3.Error as e:
print(f"An error occurred: {e}")
finally:
conn.close()

이렇게 하면 오류를 우아하게 처리하고, 오류가 발생하더라도 데이터베이스 연결을 항상 닫을 수 있습니다.

다음은 우리가 다룬 주요 데이터베이스 작업에 대한 요약 표입니다:

Operation Description Example
Connect 데이터베이스에 연결 conn = sqlite3common("example.db")
Create 새 테이블 또는 레코드 생성 cursor.execute("CREATE TABLE...")
Insert 테이블에 새 레코드 추가 cursor.execute("INSERT INTO...")
Select 데이터베이스에서 데이터 검색 cursor.execute("SELECT...")
Update 기존 레코드 수정 cursor.execute("UPDATE...")
Delete 테이블에서 레코드 제거 cursor.execute("DELETE FROM...")
Commit 데이터베이스에 변경 사항 저장 conn.commit()
Rollback 마지막 커밋 이후 변경 사항 되돌리기 conn.rollback()

그리고 이렇게 됩니다! 여러분은 파이썬을 사용하여 데이터베이스에 접근하는 데 첫 걸음을 내딛었습니다. 연습이 체득의 열쇠라는 말을 기억하십시오. 여러분이 알지 못했던 것처럼, 데이터를 관리하는 데 전문가가 될 준비가 되어 있습니다! 코딩을 즐겁게 하고, 여러분의 데이터베이스가 항상 조직되어 있고 오류가 없기를 바랍니다!

Credits: Image by storyset