import mysql.connector
import datetime

# MySQL에 연결
conn = mysql.connector.connect(
    host="localhost",       # 또는 '127.0.0.1'
    user="lee2",   # 예: 'root'
    password="Lee12345!",
    database="lee"  # 연결할 DB 이름
)

# 커서 생성
cursor = conn.cursor()

 

#######################################################
#   insert  select  
########################################################

today = datetime.date.today()
cursor.execute("INSERT INTO test (name, title, date) VALUES (%s, %s, %s)", ('newname', 'newname입니다', today))

#  COMMIT 하자! 중요!!
conn.commit()

# 예제 쿼리 실행
cursor.execute("SELECT * FROM test")

# 결과 가져오기
rows = cursor.fetchall()
for row in rows:
    print(row)

 

#######################################################
#   update  select  
########################################################

# 커서 생성
cursor = conn.cursor()

today = datetime.date.today()
cursor.execute("UPDATE test SET title = 'update 테스트입니다' WHERE id = 4 ")

# COMMIT 하자! 중요!!
conn.commit()

# 예제 쿼리 실행
cursor.execute("SELECT * FROM test")

# 결과 가져오기
rows = cursor.fetchall()
for row in rows:
    print(row)
# 연결 종료
cursor.close()
conn.close()

🛠️ 문제 요약:

  • INSERT 후 SELECT 하면 잘 보이지만
  • conn.close() 하니까 사라짐
  • MySQL DB 들어가보니 데이터 없음

🛠️원인

트랜잭션(commit) 을 하지 않아서 생기는 문제야. 😅
MySQL에서는 기본적으로 autocommit이 꺼져 있으면, INSERT, UPDATE, DELETE 같은 변경 작업 후에 commit()을 해야 실제로 데이터베이스에 반영돼.

 

conn.commit()  # 이걸 안 해서 그런거야

 

✅ 해결 방법

파이썬 코드에서 꼭 commit()을 호출해야 해. 예제 보여줄게:

 

import mysql.connector

# 1. 연결
conn = mysql.connector.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='your_database'
)

cursor = conn.cursor()

# 2. INSERT 실행
cursor.execute("""
    INSERT INTO users (name, email, age) 
    VALUES (%s, %s, %s)
""", ('홍길동', 'hong@example.com', 30))

# 3. COMMIT 하자! 중요!!
conn.commit()

# 4. SELECT 확인
cursor.execute("SELECT * FROM users WHERE email = %s", ('hong@example.com',))
result = cursor.fetchall()
print(result)

# 5. 마무리
cursor.close()
conn.close()

 

⚠️ 참고로

  • autocommit=True 옵션으로 연결하면 매번 commit() 안 해도 돼:
conn = mysql.connector.connect(..., autocommit=True)

 

하지만 실무에서는 명시적으로 commit() 하는 걸 추천해. 실수 줄이거든.

 

1. 📥 INSERT - 데이터 추가하기

INSERT INTO users (name, email, age) VALUES ('홍길동', 'hong@example.com', 30);

 

  • TIP: 여러 건을 한 번에 추가할 수도 있어요.
INSERT INTO users (name, email, age) VALUES ('김영희', 'kim@example.com', 25), ('박철수', 'park@example.com', 28);

 

2. 🔍 SELECT - 데이터 조회하기

SELECT * FROM users;
  • 조건 추가:
SELECT name, email FROM users WHERE age > 25;
  • 정렬:
SELECT * FROM users ORDER BY age DESC;
  • 상위 몇 개만 보기:
SELECT * FROM users ORDER BY age DESC LIMIT 5;

 

3. ✏️ UPDATE - 데이터 수정하기

UPDATE users SET age = 31 WHERE email = 'hong@example.com' ;
  • 주의! WHERE 없이 쓰면 전체 레코드가 수정됨!

 

4. 🗑️ DELETE - 데이터 삭제하기

DELETE FROM users WHERE email = 'park@example.com';
  • 역시 WHERE 없이 쓰면 전체가 삭제돼요. 백업은 생명입니다.

 

🔗 JOIN (테이블 간 연결)

SELECT orders.id, users.name, orders.total FROM orders JOIN users ON orders.user_id = users.id;

👉 두 테이블을 연결해서 한눈에 보기

 

📊 집계 함수 (COUNT, SUM 등)

SELECT COUNT(*) FROM users WHERE age >= 30;
 
SELECT AVG(age) FROM users;
 
SELECT user_id, SUM(total) AS total_spent FROM orders GROUP BY user_id;
 
 

🚀 인덱스 확인 및 성능 개선

SHOW INDEXES FROM users;
 
EXPLAIN SELECT * FROM users WHERE email = 'hong@example.com';
 

✨ 마무리 꿀팁

  • 실무에서는 항상 백업하고 쿼리 테스트 후 적용!
  • WHERE, LIMIT 없이 UPDATE/DELETE 하면 큰일 날 수 있어요!
  • JOIN, GROUP BY, HAVING 조합은 데이터 분석할 때 필수!

 

 

# MySQL에 연결
conn = mysql.connector.connect(
    host="localhost",       # 또는 '127.0.0.1'
    user="lee2",   # 예: 'root'
    password="비밀번호",
    database="lee"  # 연결할 DB 이름
)

 

1. ❓ 사용자 이름/비번 정확한가요?

  • MySQL에서 아래처럼 접속해보세요:
mysql -u lee2 -p

그리고 비밀번호 Lee12345! 입력!

✅ 접속되면 Python에서도 될 확률 높고
❌ 안 되면 비번이 틀렸거나 계정이 잘못됨

 

비밀번호 인증방식도 확인하세요

 

2. 📛 정말 lee2라는 사용자가 있고, localhost에서 접속할 권한이 있는지?

MySQL 로그인 상태에서 아래 쿼리 실행:

SELECT user, host, plugin FROM mysql.user WHERE user = 'lee2';
  • 결과에 lee2 | localhost 가 없으면 문제!

👉 권한 추가하는 법:

CREATE USER 'lee2'@'localhost' IDENTIFIED BY 'Lee12345!';
GRANT ALL PRIVILEGES ON lee.* TO 'lee2'@'localhost';
FLUSH PRIVILEGES;

 

3. 🧙 비밀번호 인증 방식 체크 (auth_socket 문제?)

SELECT user, host, plugin FROM mysql.user WHERE user = 'lee2';
  • plugin이 auth_socket이면 Python 연결 안 됩니다. 😵

👉 아래처럼 바꿔주세요:

ALTER USER 'lee2'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호';
FLUSH PRIVILEGES;
 
 

4. 🧪 참고: host="127.0.0.1"로 바꿔보기

간혹 MySQL이 localhost (소켓 접속)보다 127.0.0.1 (TCP 접속)을 더 잘 받는 경우도 있어요.

conn = mysql.connector.connect(
    host="127.0.0.1",
    user="lee2",
    password="비밀번호",
    database="lee"
)

 

💥 그래도 안 될 경우

  • mysql.server status 혹은 systemctl status mysql 등으로 서버가 제대로 켜졌는지 확인

📌 숫자 타입 (Numeric Types)

 

INT 정수 (4바이트)
TINYINT 작은 정수 (1바이트)
SMALLINT 작은 정수 (2바이트)
MEDIUMINT 중간 크기 정수 (3바이트)
BIGINT 큰 정수 (8바이트)
DECIMAL(M, D) 고정 소수점 숫자
FLOAT 부동 소수점 숫자 (4바이트)
DOUBLE 더 정밀한 부동 소수점 숫자 (8바이트)

 

📌 문자열 타입 (String Types)

 

CHAR(N) 고정 길이 문자열
VARCHAR(N) 가변 길이 문자열
TEXT 가변 길이 텍스트 데이터
TINYTEXT 작은 텍스트 (최대 255자)
MEDIUMTEXT 중간 크기 텍스트 (최대 16MB)
LONGTEXT 큰 텍스트 (최대 4GB)
BLOB 이진 데이터 저장
ENUM 선택된 값 중 하나 (ex. '남', '여')
SET 여러 값 선택 가능

 

📌 날짜 및 시간 타입 (Date & Time Types)

 

DATE 날짜 (YYYY-MM-DD)
DATETIME 날짜 및 시간 (YYYY-MM-DD HH:MM:SS)
TIMESTAMP UNIX 타임스탬프 (1970년 이후)
TIME 시간 (HH:MM:SS)
YEAR 연도 (YYYY)

 

함수설명

CURDATE() 현재 날짜 (형식: 'YYYY-MM-DD')
CURRENT_DATE CURDATE()의 또 다른 이름
NOW() 현재 날짜와 시간 ('YYYY-MM-DD HH:MM:SS')
CURRENT_TIMESTAMP NOW()과 동일

 

📌 JSON 타입

 

JSON JSON 형식의 데이터 저장

 

MySQL에서 데이터 타입을 선택할 때, 저장 공간과 성능을 고려하는 것이 중요합니다!

sudo mysql_secure_installation

요걸로 비밀번호랑 기타 설정하는거에요

1.우선 

비밀번호 입력창이 나오면 엔터 혹은 비밀번호 입력합니다 

 

저는 root 사용자가 auth_socket 방식으로 되어 있어서 다시 비밀번호 설정할 때 비밀번호를 안 물어봅니다

설정은 다음과 같이 확인합니다

 

mysql> select user, host,plugin from mysql.user where user = 'root' ;
+------+-----------+-------------+
| user | host      | plugin      |
+------+-----------+-------------+
| root | localhost | auth_socket |
+------+-----------+-------------+
1 row in set (0.01 sec)

 

만약 plugin이 auth_socket으로 설정되어 있다면, 현재 OS 인증 방식이 활성화된 상태입니다.

sudo mysql 로 접속하면 됨

 

OS 인증 방식과 비밀번호 인증 방식의 차이점

  • OS 인증 방식(auth_socket)
    → sudo mysql  로 접속하며, 비밀번호 없이 인증됨.
  • 비밀번호 인증 방식(mysql_native_password)
    → mysql -u root -p 로 접속하며, 비밀번호 입력 필요.

비밀번호 인증 방식으로 변경 (선택 사항)

비밀번호를 사용해 로그인할 수 있도록 변경하려면 다음 명령어를 입력하세요:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '새로운비밀번호'; FLUSH PRIVILEGES;

 

이후에는 아래 명령어로 로그인할 수 있습니다:

mysql -u root -p

 

2. 두번째 - 개발환경이면 그냥 엔터해도 돼요

"Remove anonymous users?" (익명 사용자를 제거하시겠습니까?)

  • **Yes(y/Y)**를 선택하면 익명 사용자 계정이 삭제됩니다.
    • 운영 환경에서는 보안을 위해 익명 사용자를 제거하는 것이 일반적입니다.
  • **No(아무 다른 키)**를 선택하면 익명 사용자가 그대로 유지됩니다.
    • 만약 테스트 목적으로 계속 사용할 경우 유지할 수도 있습니다.

추천: 운영 환경이라면 Yes(Y)를 선택하여 익명 사용자를 제거하는 것이 더 안전합니다. 하지만 개발 및 테스트 환경이라면 유지해도 문제가 없습니다. 😊

 

3. MySQL의 root 계정이 원격에서 로그인할 수 있도록 허용할지 물어요 저는 NO

  • 기본적으로 root 계정은 localhost에서만 로그인 가능하도록 제한됩니다.
  • 이는 네트워크를 통해 공격자가 root 계정의 비밀번호를 추측하여 로그인하는 것을 방지하기 위함입니다.
  • 만약 원격(root) 로그인을 허용하면, 인터넷이나 외부 네트워크에서 root 계정으로 접속할 수 있게 됩니다.
  • 원격 접근을 차단하면 보안이 강화되며, 일반적으로 운영 환경에서는 차단하는 것이 추천됩니다.

✅ 추천:

  • Yes(y/Y)를 입력하면 root 계정이 오직 localhost에서만 로그인할 수 있도록 설정됩니다. (더 안전함)
  • No(아무 다른 키)를 입력하면 root 계정이 원격에서 접속할 수 있습니다. (보안 위험 증가)

운영 환경이라면 보안을 위해 Yes(Y)를 입력하는 것이 좋고, 만약 원격으로 root 접근이 꼭 필요하다면 No를 선택할 수도 있습니다.

 

4. MySQL의 'test' 데이터베이스를 삭제할지 - 저는 그냥 엔터

  • 기본적으로 MySQL에는 test라는 데이터베이스가 존재합니다.
  • 이 데이터베이스는 테스트 용도로 만들어졌으며, 누구나 접근할 수 있습니다.
  • 하지만 **운영 환경(production environment)**에서는 보안상의 이유로 제거하는 것이 권장됩니다.

5. 권한(privilege) 테이블을 새로 고쳐(reload) 변경 사항을 즉시 적용할 것인지

    저는 YES

 

✅ 추천:

  • **Yes(y/Y)**를 입력하면 권한 테이블이 다시 로드되어 모든 변경 사항이 즉시 적용됩니다.
    → 일반적으로 Yes(Y)를 선택하는 것이 좋습니다!
  • **No(아무 다른 키)**를 입력하면 지금까지 변경한 내용이 즉시 반영되지 않고, MySQL을 다시 시작해야 적용됩니다.

운영 환경이라면 바로 적용하는 것이 편리하므로 Yes(Y)를 입력하는 것이 좋습니다!

👀 1. 사용자 조회

SELECT user, host, plugin  FROM mysql.user;
 

👉 현재 MySQL에 등록된 사용자 목록을 보여줍니다.

 

➕ 2. 사용자 추가 (CREATE USER)

CREATE USER '사용자이름'@'호스트' IDENTIFIED BY '비밀번호';

 

예시:

CREATE USER 'alice'@'localhost' IDENTIFIED BY 'secure1234';

🔐 localhost: 로컬에서만 접속 가능
%: 모든 IP에서 접속 가능 (주의해서 사용!)

 

mysql 의 비밀번호 정책

1️⃣ 현재 비밀번호 정책 확인

MySQL은 validate_password 플러그인을 사용하여 비밀번호 강도를 체크합니다.

현재 설정된 정책을 확인하려면 다음을 실행하세요:

 

SHOW VARIABLES LIKE 'validate_password%';

 

이 명령어는 비밀번호 최소 길이, 필수 문자 종류 등을 보여줍니다.

2️⃣ 비밀번호 요구 조건

기본적으로 MySQL의 비밀번호 정책은 다음과 같은 기준을 요구할 수 있습니다:

  • 최소 길이 (validate_password_length)
  • 숫자 포함 (validate_password_number_count)
  • 소문자 포함 (validate_password_lowercase_count)
  • 대문자 포함 (validate_password_uppercase_count)
  • 특수 문자 포함 (validate_password_special_char_count)

예를 들어, 일반적인 강력한 비밀번호는 대소문자, 숫자, 특수 문자를 포함한 8자 이상이어야 합니다.

 

3️⃣ 비밀번호 정책 완화 (선택 사항)

비밀번호 정책이 너무 엄격할 경우 완화할 수 있습니다. 예를 들어 최소 길이를 변경하고 싶다면:

 

SET GLOBAL validate_password_length = 6;

SET GLOBAL validate_password_policy = LOW;

 

요런식으로 각 항목 변경 

 

4️⃣ 변경 사항 적용 후 사용자 생성

비밀번호 정책을 확인한 후, 기준을 충족하는 비밀번호를 설정하여 사용자 계정을 생성하면 정상적으로 처리될 것입니다.

 

🎯 3. 권한 부여 (GRANT)

GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자이름'@'호스트';

 

예시:

GRANT ALL PRIVILEGES ON mydb.* TO 'alice'@'localhost';

 

👉 mydb라는 DB에 대해 모든 권한 부여

 

필요한 권한만 주고 싶다면:

GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'alice'@'localhost';

 

변경 사항 적용하려면 꼭 실행:

FLUSH PRIVILEGES;

 

❌ 4. 사용자 삭제 (DROP USER)

DROP USER '사용자이름'@'호스트';

 

예시:

DROP USER 'alice'@'localhost';

 

🔧 기타 유용한 명령어

비밀번호 변경

ALTER USER 'alice'@'localhost' IDENTIFIED BY 'newpassword123';

사용자 권한 확인

SHOW GRANTS FOR 'alice'@'localhost';
 

✅ 실전 예시 한 방 정리

-- 사용자 생성
CREATE USER 'devuser'@'%' IDENTIFIED BY 'devpass';

-- 권한 부여 (모든 DB 권한)
GRANT ALL PRIVILEGES ON *.* TO 'devuser'@'%' WITH GRANT OPTION;

-- 변경사항 적용
FLUSH PRIVILEGES;

-- 사용자 권한 보기
SHOW GRANTS FOR 'devuser'@'%';

-- 사용자 삭제
DROP USER 'devuser'@'%';
 

'mysql' 카테고리의 다른 글

MySQL에서 사용할 수 있는 주요 데이터 타입  (1) 2025.04.22
MYSQL 비밀번호 설정과 ROOT 로그인 설정  (0) 2025.04.22
MySQL 기본 명령어 정리  (0) 2025.04.21
파이썬으로 mysql 연동 예제  (0) 2025.04.21
MYSQL 설치  (0) 2025.04.19

✅ 1. MySQL 접속

mysql -u 사용자이름 -p

→ 비밀번호 입력 후 접속

 

OS 인증 방식(auth_socket)
→ sudo mysql  로 접속하며, 비밀번호 없이 인증됨.

✅ 2. 데이터베이스 관련 명령어

명령어설명
SHOW DATABASES; 모든 데이터베이스 목록 보기
CREATE DATABASE db이름; 새 데이터베이스 생성
DROP DATABASE db이름; 데이터베이스 삭제 (주의!)
USE db이름; 사용할 데이터베이스 선택

✅ 3. 테이블 관련 명령어

명령어설명
SHOW TABLES; 현재 DB의 테이블 목록 보기
DESCRIBE 테이블명; 테이블 구조 확인 (컬럼, 타입 등)
DROP TABLE 테이블명; 테이블 삭제 (주의!)

📋 테이블 만드는 법 (CREATE TABLE)

CREATE TABLE users (
          id INT AUTO_INCREMENT PRIMARY KEY,
          username VARCHAR(50) NOT NULL,
          email VARCHAR(100),
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

💡 설명

컬럼명타입설명
id INT 자동 증가하는 기본키
username VARCHAR(50) 최대 50자, NULL 불가
email VARCHAR(100) 이메일 주소
created_at TIMESTAMP 기본값으로 현재 시간 저장

🧪 데이터 삽입 / 조회 예제

-- 데이터 삽입
INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com');

-- 데이터 조회
SELECT * FROM users;

-- 조건부 조회
SELECT * FROM users WHERE username = 'alice';

 

함수설명 : 날자를 함수로 입력할 때 다음처럼 사용하세요 대소문자 안가립니다

CURDATE() 현재 날짜 (형식: 'YYYY-MM-DD')
CURRENT_DATE CURDATE()의 또 다른 이름
NOW() 현재 날짜와 시간 ('YYYY-MM-DD HH:MM:SS')
CURRENT_TIMESTAMP NOW()과 동일

🛠️ ALTER TABLE 기본 구조

ALTER TABLE 테이블명 수정작업;
 

🔧 컬럼 추가 (ADD COLUMN)

ALTER TABLE users ADD COLUMN age INT;
 

👉 users 테이블에 age라는 정수형 컬럼을 추가

✏️ 컬럼 이름/타입 변경 (CHANGE COLUMN 또는 MODIFY COLUMN)

✅ 이름 + 타입 둘 다 바꾸기 (CHANGE)

ALTER TABLE users CHANGE COLUMN age user_age INT;
 

👉 age를 user_age로 이름 변경하면서, 타입도 변경 가능

⚠ CHANGE COLUMN은 기존 컬럼 이름새 컬럼 이름 모두 명시해야 함

✅ 타입만 바꾸기 (MODIFY)

ALTER TABLE users MODIFY COLUMN user_age VARCHAR(3);

👉 user_age 컬럼을 문자열로 변경 

 

❌ 컬럼 삭제 (DROP COLUMN)

ALTER TABLE users DROP COLUMN user_age;

👉 user_age 컬럼을 완전히 삭제 (되돌릴 수 없음!!)

 

🧱 기본키 또는 제약 조건 추가/삭제

기본키 추가

ALTER TABLE users ADD PRIMARY KEY (id);

UNIQUE 제약 조건 추가

ALTER TABLE users ADD UNIQUE (email);

NOT NULL 추가

ALTER TABLE users MODIFY COLUMN email VARCHAR(100) NOT NULL;

📋 전체 예제 모음

-- 1. 컬럼 추가
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- 2. 컬럼 이름과 타입 변경
ALTER TABLE users CHANGE COLUMN phone contact_number VARCHAR(30);

-- 3. 타입만 변경
ALTER TABLE users MODIFY COLUMN contact_number TEXT;

-- 4. 컬럼 삭제
ALTER TABLE users DROP COLUMN contact_number;
 

🎯 마무리 팁

  • 세미콜론 ; 빼먹으면 명령이 끝나지 않음
  • NULL 허용 여부, DEFAULT 값 설정 → 나중에 에러 피하기 위해 중요
  • MySQL 워크벤치나 DBeaver 같이 시각적 도구도 병행하면 편리함

✅ 1. 라이브러리 설치

pip install mysql-connector-python

 

✅ 2. 파이썬 기본 코드 예제

import mysql.connector

# MySQL에 연결
conn = mysql.connector.connect(
    host="localhost",       # 또는 '127.0.0.1'
    user="your_username",   # 예: 'root'
    password="your_password",
    database="your_database"  # 연결할 DB 이름
)

# 커서 생성
cursor = conn.cursor()

# 예제 쿼리 실행
cursor.execute("SELECT * FROM your_table")

# 결과 가져오기
rows = cursor.fetchall()
for row in rows:
    print(row)

# 연결 종료
cursor.close()
conn.close()

🧠 참고 포인트

항목설명
host 로컬 개발 환경이면 localhost, 원격이면 IP 또는 도메인
user / password MySQL 계정 정보 입력
database 사용할 데이터베이스 이름
cursor.fetchall() 전체 행을 리스트로 가져옴 (fetchone()도 있음)

 

서버환경은 wsl ubuntu 22.04 입니다

wsl + python + mysql 셋팅 해보려구해요 

 

요렇게 mysql서버 설치

sudo apt update
sudo apt install mysql-server -y

 

그리고 이렇게 서버 기동시킵니다 START 하는거에요

sudo service mysql start

 

그리고 요걸로 비밀번호랑 기타 설정하는거에요

sudo mysql_secure_installation

비밀번호 입력하고 나머지 설정 저는 영어 약해서 그냥 yes로 다 설정 ㅎㅎㅎ

 

그 다음 요렇게 MYSQL 접속 

sudo mysql -u root -p

그리고 비번 입력 비번 없으면 엔터 

 

그리고 나서 테이블 만들고 데이터베이스 운용하는 거죠 

 

 

 

 

 

+ Recent posts