- SQLite 데이터베이스를 메모리에서 사용하는 방법은 파이썬에서 매우 간단
- 데이터베이스를 파일로 저장하는 대신, 연결 문자열로 `:memory:`를 지정
- 데이터는 프로그램이 실행되는 동안 RAM에만 존재하며, 프로그램이 종료되면 자동으로 사라짐.
기본적인 사용법
import sqlite3
# 1. 메모리 데이터베이스 연결
# ':memory:'는 데이터베이스가 메모리에 생성되도록 지시합니다.
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()
# 2. 테이블 생성 (예시)
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
''')
print("테이블 'users'가 성공적으로 생성되었습니다.")
# 3. 데이터 삽입 (예시)
users_data = [
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com')
]
cursor.executemany("INSERT INTO users (name, email) VALUES (?, ?)", users_data)
conn.commit() # 변경사항을 커밋합니다. 메모리 DB라도 커밋해야 데이터가 반영됩니다.
print("데이터가 성공적으로 삽입되었습니다.")
# 4. 데이터 조회 (예시)
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
print("\n테이블 'users'의 모든 데이터:")
for row in rows:
print(row)
# 5. 데이터 업데이트 (예시)
cursor.execute("UPDATE users SET email = ? WHERE name = ?", ('alice.new@example.com', 'Alice'))
conn.commit()
print("\n'Alice'의 이메일이 업데이트되었습니다.")
# 6. 업데이트된 데이터 조회
cursor.execute("SELECT * FROM users WHERE name = 'Alice'")
print(f"업데이트된 Alice 정보: {cursor.fetchone()}")
# 7. 데이터 삭제 (예시)
cursor.execute("DELETE FROM users WHERE name = ?", ('Bob',))
conn.commit()
print("\n'Bob'의 데이터가 삭제되었습니다.")
# 8. 최종 데이터 조회
cursor.execute("SELECT * FROM users")
print("\n데이터 삭제 후 테이블 'users'의 모든 데이터:")
for row in cursor.fetchall():
print(row)
# 9. 연결 닫기
# 메모리 DB는 프로그램 종료 시 자동으로 사라지지만, 명시적으로 닫아주는 것이 좋습니다.
conn.close()
print("\n데이터베이스 연결이 닫혔습니다.")
```
메모리 SQLite 사용의 장점
- **속도:** 디스크 I/O가 없기 때문에 파일 기반 데이터베이스보다 훨씬 빠릅니다.
- **간편성:** 파일 관리나 경로 지정이 필요 없습니다.
- **임시 데이터 처리:** 프로그램 실행 중에만 필요한 데이터를 저장하고 처리하는 데 이상적입니다.
- **테스트:** 단위 테스트나 통합 테스트에서 실제 데이터베이스에 영향을 주지 않고 격리된 환경을 제공하는 데 유용합니다.
- **보안:** 데이터가 디스크에 남지 않아 민감한 임시 데이터 처리에 유리합니다.
메모리 SQLite 사용의 단점
- **휘발성:** 프로그램이 종료되거나 연결이 닫히면 모든 데이터가 사라집니다. 데이터를 영구적으로 저장해야 한다면 파일 기반 데이터베이스를 사용해야 합니다.
- **메모리 사용:** 대량의 데이터를 저장하면 시스템 메모리를 많이 차지할 수 있습니다.
언제 메모리 SQLite를 사용해야 하나요
- 복잡한 인메모리 데이터 구조가 필요하지만, 파이썬의 기본 자료구조(리스트, 딕셔너리 등)로는 충분하지 않을 때 (예: SQL 쿼리의 이점 활용).
- 데이터베이스 스키마와 SQL 쿼리를 테스트할 때.
- 임시로 데이터를 저장하고 처리해야 할 때.
- 성능이 중요한 배치 작업에서 중간 데이터를 저장할 때.