데이터베이스 테이블에 새로운 레코드를 생성하고자 할 때 INSERT 문이 반드시 필요합니다. 이 글에서는 Python에서 MySQLdb 모듈을 사용해 데이터를 삽입하는 다양한 방법을 예제와 함께 살펴보겠습니다.
기본 INSERT 문 실행하기
다음 예제는 SQL INSERT 문을 실행하여 EMPLOYEE 테이블에 하나의 레코드를 생성합니다.
#!/usr/bin/python
import MySQLdb
# 데이터베이스 연결 열기
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# cursor() 메서드로 커서 객체 준비
cursor = db.cursor()
# 데이터베이스에 레코드를 삽입하는 SQL 쿼리 준비
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# SQL 명령 실행
cursor.execute(sql)
# 변경 사항을 데이터베이스에 커밋
db.commit()
except:
# 오류 발생 시 롤백
db.rollback()
# 서버 연결 종료
db.close()동적 SQL 쿼리 생성하기
위 예제는 아래와 같이 작성하면 SQL 쿼리를 동적으로 생성할 수 있습니다. 값이 고정되어 있지 않고 변수에 따라 달라져야 하는 경우에 유용한 방식입니다.
#!/usr/bin/python
import MySQLdb
# 데이터베이스 연결 열기
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# cursor() 메서드로 커서 객체 준비
cursor = db.cursor()
# 데이터베이스에 레코드를 삽입하는 SQL 쿼리 준비
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# SQL 명령 실행
cursor.execute(sql)
# 변경 사항을 데이터베이스에 커밋
db.commit()
except:
# 오류 발생 시 롤백
db.rollback()
# 서버 연결 종료
db.close()매개변수 직접 전달 방식
다음 코드 조각은 매개변수를 직접 전달할 수 있는 또 다른 실행 형태입니다.
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................참고 사항
INSERT 작업을 수행할 때는 다음 사항을 기억하면 좋습니다.
- commit(): INSERT, UPDATE, DELETE 등 데이터를 변경하는 작업 후에는 반드시 commit()을 호출해야 변경 사항이 실제 데이터베이스에 저장됩니다.
- rollback(): 오류가 발생했을 때 rollback()을 호출하면 트랜잭션이 시작되기 전 상태로 되돌려 데이터 무결성을 보호할 수 있습니다.
- SQL 인젝션 주의: 문자열 포매팅(% 연산자)으로 쿼리를 만들 때는 외부 입력값을 그대로 사용하지 않도록 주의해야 합니다. 가능하다면 매개변수화된 쿼리(parameterized query)를 사용하는 것이 안전합니다.