Chapter 16. MySQL 연결

MySQL은 가장 많이 사용되는 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.
웹 프로그램, 쇼핑몰, 기업 시스템 등 다양한 분야에서 사용되며, 파이썬과 함께 데이터베이스 프로그램을 개발할 때 많이 활용됩니다.
SQLite는 하나의 파일을 사용하는 데이터베이스라면, MySQL은 데이터베이스 서버를 설치하여 여러 사용자가 동시에 사용할 수 있는 서버형 데이터베이스입니다.
- 무료(Open Source)로 사용할 수 있다.
- 속도가 빠르고 안정성이 높다.
- 대용량 데이터를 처리할 수 있다.
- 여러 사용자가 동시에 접속할 수 있다.
- 웹 개발에서 가장 많이 사용되는 데이터베이스 중 하나이다.
- 쇼핑몰
- 회원관리 시스템
- 게시판
- ERP
- 학교 관리 시스템
- 기업 업무 프로그램
| SQLite | MySQL |
|---|---|
| 하나의 파일(DB) | 서버 기반 DB |
| 설치가 간단 | 서버 설치 필요 |
| 개인 프로젝트 | 기업용 프로젝트 |
| 소규모 프로그램 | 대규모 프로그램 |
MySQL은 공식 홈페이지에서 다운로드할 수 있습니다.
설치 순서는 다음과 같습니다.
- MySQL Server 설치
- MySQL Workbench 설치
- Root 비밀번호 설정
- 서버 실행
예를 들어 다음과 같이 접속합니다.
| 항목 | 값 |
|---|---|
| Host | localhost |
| Port | 3306 |
| User | root |
| Password | 1234 |
mysql -u root -p ****** show databases; CREATE DATABASE pyschool; use pyschool;
CREATE TABLE member(
member_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
age INT
);
AUTO_INCREMENT는 데이터를 추가할 때 번호를 자동으로 증가시킵니다.
PyMySQL은 파이썬에서 MySQL을 사용할 수 있도록 해주는 라이브러리입니다.
SQLite는 기본 제공되지만 MySQL은 별도의 라이브러리를 설치해야 합니다.
pip install pymysql
pip show pymysql
import pymysql
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
print("MySQL 연결 성공")
conn.close()
cursor = conn.cursor()
CRUD는 데이터베이스에서 가장 많이 사용하는 네 가지 작업을 의미합니다.
| 기능 | SQL |
|---|---|
| Create | INSERT |
| Read | SELECT |
| Update | UPDATE |
| Delete | DELETE |
mysqlinsert.py
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("insert into member(name, age) values(%s,%s)", ("홍길동", 20))
cursor.execute("insert into member(name, age) values(%s,%s)", ("이순신", 30))
cursor.execute("insert into member(name, age) values(%s,%s)", ("강감찬", 40))
conn.commit()
데이터가 저장됩니다.
mysqlselect.py
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("SELECT * FROM member")
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
mysqlupdate.py
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("UPDATE member SET age=%s WHERE member_id=%s", (21, 1))
conn.commit()
conn.close()
mysqldelete.py
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("DELETE FROM member WHERE member_id=%s", (1,))
conn.commit()
conn.close()
mysqlselectcount.py
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("SELECT count(*) FROM member")
count = cursor.fetchone()
print(count)
conn.close()
mysqlselectwhere.py
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("SELECT * FROM member where age > %s", (20,))
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
사용자의 입력값을 SQL에 직접 연결하면 보안 문제가 발생할 수 있습니다.
sql = "SELECT * FROM member WHERE name='" + name + "'"
sql = "SELECT * FROM member WHERE name = %s"
%s를 사용하면 SQL Injection 공격을 방지할 수 있습니다.
import pymysql
c host="localhost", user="root", password="mariadb", database="pyschool", charset="utf8")
cursor = conn.cursor()
cursor.execute("SELECT * FROM member where name like %s", ("%이%",))
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
| SQLite | MySQL |
|---|---|
| sqlite3 | pymysql |
| connect() | connect() |
| cursor() | cursor() |
| execute() | execute() |
| commit() | commit() |
| fetchall() | fetchall() |
사용 방법은 매우 비슷합니다.
- MySQL은 오픈소스 관계형 데이터베이스 관리 시스템이다.
- MySQL은 서버형 데이터베이스로 여러 사용자가 동시에 사용할 수 있다.
- PyMySQL을 사용하여 파이썬에서 MySQL에 연결할 수 있다.
- CRUD 작업은 데이터베이스에서 가장 많이 사용하는 네 가지 작업이다.
- SQL Injection 공격을 방지하기 위해 %s를 사용해야 한다.
- SQLite와 MySQL은 사용 방법이 매우 유사하다.