
파이썬에서 데이터베이스를 활용하는 가장 보편적인 방법은 DB API 2.0 표준을 준수하는 라이브러리를 사용하는 것입니다. 이 표준 덕분에 MySQL, PostgreSQL, SQLite 등 다양한 데이터베이스 시스템에 동일한 방식으로 접속하고 데이터를 다룰 수 있습니다.
1. 필수 라이브러리 설치
MySQL 데이터베이스에 접속하려면 공식 커넥터인 mysql-connector-python 라이브러리가 필요합니다. 이 라이브러리는 DB API 2.0 표준을 따릅니다.
설치는 다음과 같이 간단합니다.
pip install mysql-connector-python
2. 데이터베이스 연결 및 커서 생성
데이터베이스 작업을 시작하려면 먼저 연결(Connection)을 설정해야 합니다. 연결에 성공했다면, SQL 쿼리를 실행하고 그 결과를 처리하기 위한 커서(Cursor) 객체를 생성합니다.
다음은 MySQL 서버에 연결하는 예시 코드입니다.
import mysql.connector
try:
# 데이터베이스 연결 정보
mydb = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
# 커서 객체 생성
mycursor = mydb.cursor()
print("데이터베이스 연결 성공!")
except mysql.connector.Error as err:
print(f"연결 오류: {err}")
# 오류 발생 시 연결 종료 확인
if 'mydb' in locals() and mydb.is_connected():
mydb.close()
host: MySQL 서버의 주소입니다. 로컬 환경에서는localhost또는127.0.0.1을 사용하세요.user: MySQL 사용자 이름입니다.password: 사용자의 비밀번호입니다.database: 접속할 데이터베이스의 이름입니다.
3. SQL 쿼리 실행
커서 객체의 execute() 메서드를 이용해 SQL 쿼리를 실행할 수 있습니다. 쿼리 방식은 데이터를 조회하는 SELECT와 데이터를 변경하는 INSERT/UPDATE/DELETE로 구분됩니다.
3.1. 데이터 조회 (SELECT)
SELECT 쿼리를 실행한 후에는 fetchone(), fetchall(), fetchmany() 메서드로 결과를 가져옵니다.
fetchone(): 쿼리 결과 중 첫 번째 행만 반환합니다.fetchall(): 쿼리 결과의 모든 행을 리스트 형태로 반환합니다.fetchmany(size): 지정한size만큼의 행을 가져옵니다.
# 'customers' 테이블의 모든 데이터 조회
mycursor.execute("SELECT * FROM customers")
# 모든 결과 가져오기
myresult = mycursor.fetchall()
for row in myresult:
print(row)
3.2. 데이터 변경 (INSERT, UPDATE, DELETE)
데이터를 수정하는 쿼리(DML)를 실행한 후에는 commit() 메서드를 호출하여 변경 사항을 데이터베이스에 최종적으로 반영해야 합니다.
# 데이터 삽입 (INSERT)
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)
# 변경 사항 최종 반영
mydb.commit()
print(mycursor.rowcount, "개 레코드가 성공적으로 추가되었습니다.")
여기서 %s는 플레이스홀더(placeholder) 역할을 합니다. 변수를 직접 문자열에 포함하는 대신 이 방식을 사용하면 SQL 인젝션 공격을 효과적으로 방어할 수 있습니다.
4. 자원 해제 (연결 종료)
모든 작업이 끝나면 데이터베이스 리소스 관리를 위해 연결(connection)과 커서(cursor)를 반드시 닫아야 합니다. 이 과정은 try...finally나 with 문을 활용하여 안전하게 처리하는 것이 좋습니다. 특히, with 문은 코드를 벗어날 때 자동으로 리소스를 해제해주기 때문에 더 권장됩니다.
try...finally 예제
import mysql.connector
mydb = None
mycursor = None
try:
mydb = mysql.connector.connect(...)
mycursor = mydb.cursor()
# 기타 작업 코드...
finally:
if mycursor:
mycursor.close()
if mydb and mydb.is_connected():
mydb.close()
with 문 예제 (권장)
with 문을 사용하면 Connection 및 Cursor 객체가 컨텍스트 매니저 역할을 하여, 작업이 완료되거나 예외가 발생하더라도 close와 commit/rollback이 자동으로 처리됩니다.
import mysql.connector
# with 문으로 연결을 관리
with mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
) as mydb:
# with 문으로 커서 관리
with mydb.cursor() as mycursor:
# SELECT 쿼리 실행
mycursor.execute("SELECT name, address FROM customers")
results = mycursor.fetchall()
for row in results:
print(row)
이 방법은 코드를 간결하게 만들고, 예외 상황에서도 자원이 안전하게 해제되는 것을 보장합니다.