개요
2022.11.05 - [Python] PyMySQL - MySQL SELECT 하기에서 python으로 MySQL에 저장된 데이터를 조회해 봤는데, 이번 글에서는 INSERT를 수행해보려고 한다.
cursor.execute
PyMySQL로 일회성 SQL을 실행할 때는 cursor 클래스에 정의된 execute 함수를 사용한다.
예시로 다음과 같은 users 테이블이 있다고 하자.
DDL
더보기
CREATE TABLE users (
NAME VARCHAR(10),
EMAIL VARCHAR(50),
PRIMARY KEY (NAME)
);
INSERT INTO users(NAME, EMAIL) VALUES
('june', 'june@tistory.com'),
('passwd', 'passwd@tistory.com')
;
해당 테이블에 데이터를 추가하는 경우에는 DB connect -> cursor 획득 -> SQL execute -> Transaction commit -> DB connection close 순서로 작업을 수행한다.
import pymysql as pymysql
def connect_db():
return pymysql.connect(host=environ_map['ENV_BACKEND_HOST'],
port=int(environ_map['ENV_BACKEND_PORT']),
user=environ_map['ENV_BACKEND_USER'],
password=environ_map['ENV_BACKEND_PASSWORD'],
db=environ_map['ENV_BACKEND_DATABASE'], charset='utf8mb4', local_infile=1)
sql = """INSERT INTO users VALUES
('pycharm', 'pycharm@test.net')
"""
conn = connect_db()
cur = conn.cursor(pymysql.cursors.DictCursor)
# INSERT문 수행
cur.execute(sql)
conn.commit()
conn.close()
실행 결과
Placeholder 사용
INSERT문의 경우 쿼리 자체는 동일하고 값만 달라지는 경우가 많다. 이때, 실행할 SQL 문자열에 자리표시자(Placeholder)를 사용하고, execute 함수에 튜플/리스트/딕셔너리 형식으로 값을 전달하면 자동으로 값을 전달한 순서대로 자리표시자에 매핑되어 쿼리를 실행한다.
# SQL 정의
sql = """INSERT INTO users VALUES
(%s, %s)
"""
conn = connect_db()
cur = conn.cursor(pymysql.cursors.DictCursor)
# SQL 실행
cur.execute(sql, ('python', 'python@python.org'))
conn.commit()
conn.close()
실행 결과
cursor.executemany
여러 데이터를 대상으로 동일한 SQL문을 수행해야 하는 경우, execute 함수를 반복적으로 수행하는 것 대신 executemany 함수 사용을 고려할 수 있다.
sql = """INSERT INTO users VALUES
(%s, %s)
"""
list_args = [
['test', 'test@test,com'],
['daum', 'test@daum.net'],
['kakao', 'kakao@test,com'],
]
conn = connect_db()
cur = conn.cursor(pymysql.cursors.DictCursor)
# SQL 실행
cur.executemany(sql, list_args)
conn.commit()
conn.close()
실행 결과
참고 문서
https://pymysql.readthedocs.io/en/latest/user/examples.html
https://pymysql.readthedocs.io/en/latest/modules/cursors.html