본문 바로가기
인터페이스 개발/Python

Python - 파일[데이터베이스] - MySQL/MariaDB, 테이블 생성, 데이터 삽입, 테이블 조회, 수정 및 삭제

by cooluk 2020. 7. 29.

Chap.7-3 SQL 고급[조인] 이후 (Python 데이터베이스 연동)

 

Chap.14 파일[데이터베이스] - MySQL/MariaDB, 테이블 생성, 데이터 삽입, 테이블 조회, 수정 및 삭제

 

데이터베이스

MySQL/MariaDB, 테이블 생성, 데이터 삽입, 테이블 조회, 수정 및 삭제

 

 

MySQL/MariaDB

  • pip install mysqlclient

import MySQLdb

db = MySQLdb.connect(db="sqldb", host="localhost", user="root", passwd="1234", charset='utf8')

cursor = db.cursor()

# cursor를 통해 SQL 문장 실행

# 자원 해제 및 접속 해제
cursor.close()
db.close()

 

 

테이블 생성 / 데이터 삽입

import MySQLdb

db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')

cursor = db.cursor()

cursor.execute('DROP TABLE IF EXISTS tblAddr')

cursor.execute("""
CREATE TABLE tblAddr(
    name CHAR(16) PRIMARY KEY,
    phone CHAR(16),
    addr TEXT
)
""")

cursor.execute("INSERT INTO tblAddr VALUES('김상형', '123-4567', '오산')")
cursor.execute("INSERT INTO tblAddr VALUES('한경은', '555-1004', '수원')")
cursor.execute("INSERT INTO tblAddr VALUES('한주완', '444-1092', '대전')")

db.commit()
cursor.close()
db.close()

결과

TEXT : 길이의 제한을 두지 않음 (cf. LONGTEXT)

 

 

 

테이블 조회

.fetchall()

import MySQLdb

db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')

cursor = db.cursor()

cursor.execute("SELECT * FROM tblAddr")

table = cursor.fetchall()
for record in table:
    print(f"이름: {record[0]}, 전화: {record[1]}, 주소: {record[2]}")

cursor.close()
db.close()

결과

이름: 김상형, 전화: 123-4567, 주소: 오산
이름: 한경은, 전화: 555-1004, 주소: 수원
이름: 한주완, 전화: 444-1092, 주소: 대전

 

 

.fetchone()

import MySQLdb
db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

cursor.execute("SELECT * FROM tblAddr")
while True:
    record = cursor.fetchone()
    if record == None: break

    print(f"이름: {record[0]}, 전화: {record[1]}, 주소: {record[2]}")

cursor.close()
db.close()

결과

이름: 김상형, 전화: 123-4567, 주소: 오산
이름: 한경은, 전화: 555-1004, 주소: 수원
이름: 한주완, 전화: 444-1092, 주소: 대전

 

 

.fetchall() 자료형 확인

import MySQLdb

db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

cursor.execute("SELECT * FROM tblAddr ORDER BY addr")

table = cursor.fetchall()
for record in table:
    print(record)
    print(f"이름: {record[0]}, 전화: {record[1]}, 주소: {record[2]}")

cursor.close()
db.close()

결과

<class 'tuple'> (('한주완', '444-1092', '대전'), ('한경은', '555-1004', '수원'), ('김상형', '123-4567', '오산'))
('한주완', '444-1092', '대전')
이름: 한주완, 전화: 444-1092, 주소: 대전
('한경은', '555-1004', '수원')
이름: 한경은, 전화: 555-1004, 주소: 수원
('김상형', '123-4567', '오산')
이름: 김상형, 전화: 123-4567, 주소: 오산

 

 

WHERE 절 이용

import MySQLdb
db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

cursor.execute("SELECT addr FROM tblAddr WHERE name = '김상형'")

record = cursor.fetchone()

if record : print(f"김상형은 {record[0]}에 살고 있습니다.")
else : print("김상형은 없는 이름입니다.")  # 값이 없으면 None
# 만약 fetchall()로 값이 없으면 비어있는 tuple

cursor.close()
db.close()

결과

김상형은 오산에 살고 있습니다.

찾고자하는 데이터가 PRIMARY KEY면 굳이 Tuple(fetchall)을 이용할 필요가 없다. (∵ 굳이 인덱스로 접근)

 

 

 

예제(1)

검색하는 사람을 사용자로부터 입력 받아서 출력

import MySQLdb
db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

name = input("검색어(이름): ")

# cursor.execute(f"SELECT addr FROM tblAddr WHERE name = '{name}'")
sql = "SELECT addr FROM tblAddr WHERE name = %s"
cursor.execute(sql, (name,))  # 요소가 하나일 때 튜플임을 알려줘야한다.

record = cursor.fetchone()

if record : print(f"{name}은 {record[0]}에 살고 있습니다.")
else : print(f"{name}은 없는 이름입니다.")

cursor.close()
db.close()

결과

검색어(이름): 한주완
한주완은 대전에 살고 있습니다.

SQL문에서 오류가 있으면
MySQLdb._exceptions.ProgrammingError

 

 

 

예제(2)

검색하는 사람을 사용자로부터 3가지 정보를 입력 받아서 INSERT

import MySQLdb
db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

print("데이터 추가================")
name = input("이름: ")
phone = input("전화: ")
addr = input("주소: ")
print("==========================")
sql = "INSERT INTO tblAddr VALUES(%s, %s, %s)"
cursor.execute(sql, (name, phone, addr))  # 요소가 하나일 때 튜플임을 알려줘야한다.
db.commit()

print("추가 완료")

cursor.close()
db.close()

결과

데이터 추가================
이름: 김태림
전화: 123-7890
주소: 서울
==========================
추가 완료

중복된 이름을 추가하면 Python과 SQL문 자체는 이상없지만 오류 발생
MySQLdb._exceptions.IntegrityError: (1062, "Duplicate entry '홍길동' for key 'PRIMARY'")
이름이 PRIMARY KEY이므로 중복 허용 X

이름이 지정한 길이보다 길면 오류발생
MySQLdb._exceptions.DataError: (1406, "Data too long for column 'name' at row 1")
따라서 다음과 같이 예외 처리를 해주자.

 

 

예외 처리

import MySQLdb
db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

try:  # 예외 처리
    print("데이터 추가================")
    name = input("이름: ")
    phone = input("전화: ")
    addr = input("주소: ")
    print("==========================")
    sql = "INSERT INTO tblAddr VALUES(%s, %s, %s)"
    cursor.execute(sql, (name, phone, addr))
    db.commit()

    print("추가 완료")
except Exception as e:  # 예외 처리
    print(e)

cursor.close()
db.close()

결과

데이터 추가================
이름: 김ㄴㅁㅇ롸ㅣㅁㄴ올;ㅣ만오라ㅣㅁㄴ오리ㅏㅇㄴ몲니;ㄹㄴ모
전화: 123-1234
주소: 서울
==========================
(1406, "Data too long for column 'name' at row 1")

 

 

 

수정 및 삭제

수정(UADATE)

import MySQLdb

db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

cursor.execute("UPDATE tblAddr SET addr = '제주도' WHERE name = '김상형'")
db.commit()

cursor.close()
db.close()

 

삭제(DELETE)

import MySQLdb

db = MySQLdb.connect(db="sqldb", host="localhost",
                     user="root", passwd="1234", charset='utf8')
cursor = db.cursor()

cursor.execute("DELETE FROM tblAddr WHERE name = '김상형'")
db.commit()

cursor.close()
db.close()

댓글