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()
'인터페이스 개발 > Python' 카테고리의 다른 글
Python - 파일[데이터베이스] - SQlite 데이터 베이스 (0) | 2020.07.29 |
---|---|
Python - 파일[예제] - Database Application (0) | 2020.07.29 |
Python - [추가] - 데이터 시각화 Matplot (0) | 2020.07.28 |
Python - [추가] - 배열 데이터를 효과적으로 다루는 NumPy (0) | 2020.07.28 |
Python - 고급 문법[데코레이터] - 일급 시민, 지역 함수, 함수 데코레이터, 클래스 데코레이터 (0) | 2020.07.28 |
댓글