Python

[Python] PyMySQL - DELETE 하기

비번변경 2023. 11. 21. 19:19

개요

2022.11.05 - [Python] PyMySQL - MySQL SELECT 하기

2023.11.17 - [Python] PyMySQL - INSERT 하기

 

위 두 개 글에서 Python을 이용해 MySQL에 저장된 데이터를 조회하고, 데이터를 테이블에 저장했다. 이번 글에서는 테이블에 저장한 데이터를 삭제해보려고 한다.

 

 

예시 테이블

예시로 위와 같은 users 테이블이 있다고 하자.

DDL

더보기
CREATE TABLE users (
    NAME    VARCHAR(10),
    EMAIL   VARCHAR(50),
    PRIMARY KEY (NAME)
);

INSERT INTO users(NAME, EMAIL) VALUES 
('daum', 'test@daum.net'),
('june', 'june@tistory.com'),
('kakao', 'kakao@test.com'),
('passwd', 'passwd@tistory.com'),
('pycharm', 'pycharm@test.net'),
('python', 'python@python.org'),
('test', 'test@test.com'),
;

 

 

cursor.execute

DELETE문을 실행하는 것도 INSERT문을 실행하는 것과 동일한 방식이다. DB connect -> cursor 획득 -> SQL execute -> Transaction commit -> DB connection close 순서로 작업을 수행한다.

import 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 = """DELETE FROM users
WHERE NAME = 'test';"""

conn = connect_db()
cur = conn.cursor(pymysql.cursors.DictCursor)

# DELETE문 수행
cur.execute(sql)
conn.commit()
conn.close()

 

실행 결과

 

 

 

cursor.executemany

executemany 함수로 여러 데이터를 삭제할 수 있다.

names = [{'name': 'python'}, {'name': 'pycharm'}]
sql = """DELETE FROM yujin_test_db.users
WHERE NAME = %(name)s;"""

conn = connect_db()
cur = conn.cursor(pymysql.cursors.DictCursor)

# DELETE문 수행
cur.executemany(sql, names)
conn.commit()
conn.close()

print(f'DELETE {cur.rowcount} rows')

만약 executemany 함수로 전달하는 args가 딕셔너리인 경우 자리 표시자에 키를 지정하면 자동으로 값이 매핑된다.

 

실행 결과

cursor.rowcount 속성에는 execute나 executemany로 영향받는 행의 수를 반환하는 것 같다. (확실하진 않다.)

 

참고 문서

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-rowcount.html

 

 

728x90