Gom3rye
파이썬과 데이터베이스 연동 본문
먼저 사용할 데이터베이스 서버를 확인하자. (Maria DB와 Mongo DB 모두 구동되어 있는지 확인)
데이터베이스 연동 방법
- 프로그래밍 언어에 드라이버를 설치해서 직접 연동하는 방식
- 프레임워크를 이용하는 방식
- SQL Mapper를 이용하는 방식: RDBMS에서 가능, 대표적인 SQL Mapper가 Java의 MyBatis
- ORM 형태를 이용하는 방식: RDBMS의 테이블을 프로그래밍 언어의 Class와 매핑하고 데이터를 Instance와 매핑하는 방식의 프레임워크로 Java에서는 Hibernate가 가장 유명하고 Python에서는 Django의 ORM이나 SQLAIchemy가 많이 사용된다.
Python과 Mongo DB 연동
- 필요한 드라이버 설치: 드라이버라고 하지 않고 패키지라는 표현을 많이 사용한다. → pymongo 패키지 설치: pip install pymongo
- Mongo DB 컬렉션 연결
from pymongo import MongoClient
# 데이터베이스 서버 연결
con = MongoClient('127.0.0.1', 27017) # 서벗 IP, 포트번호
# 데이터베이스 연결
hyundai = con.hyundai
# collection 연결 (만들기)
cars = hyundai.cars
- 위는 데이터가 안 들어갔으므로 복사본 형태로만 hyundai(db), cars(colletion)가 있는 상태
cars.insert_one({'name':'그랜저', 'price':4000}) # 실제 데이터가 들어왔으므로 원본에도 생성
cars.insert_many([{'name':'소나타', 'price':2500},{'name':'제네시스', 'price':6000}])
- 이제 몽고 db에서 show databases 하면 hyundai가 보인다.
데이터 조회
cursor = cars.find()
for car in cursor:
print(car)
# 이름이 소나타인 데이터 조회
cursor = cars.find({'name':'소나타'})
for car in cursor:
print(car)
# price가 3000이 넘는 데이터 조회
cursor= cars.find({'price': {'$gte':3000}})
for car in cursor:
print(car)
# {'_id': ObjectId('6823e6f86bceeb7ee6270597'), 'name': '그랜저', 'price': 4000}
# {'_id': ObjectId('6823e6f86bceeb7ee6270599'), 'name': '제네시스', 'price': 6000}
데이터 수정 (update_one, update_many)
cars.update_many({'name':'소나타'}, {'$set': {'name':'sonata'}})
데이터 삭제
# 1. 가장 먼저 들어온 3개의 _id만 추출
first_three = cars.find().sort('_id', 1).limit(3)
ids_to_keep = [doc['_id'] for doc in first_three]
# 2. 나머지 (3개 이외) 문서 삭제
cars.delete_many({'_id': {'$nin': ids_to_keep}})
# 금액이 3000보다 큰 데이터 삭제
cars.delete_many({'price':{'$gte':3000}})
Python과 Maria DB 연동
몽고 디비와 동일한 방식으로 연동된다.
- 패키지 설치: pip install pyMySQL
- 접속 확인: import pymysql (접속 해제: 변수.close())
변수 = pymysql.connect( host='데이터베이스위치',
port=포트번호,
user='계정',
passwd='mysql 할 때 설정한 비밀번호',
db='데이터베이스이름',
charset='인코딩방식' )
import pymysql
con = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='~~~~~',
db='autoever',
charset='utf8mb4')
print(con)
con.close()
- 연결
- MariaDB 가서 create table~ 하면 되지만 일딴 있는 거 사용하겠다. (select * from usertbl;)
- DML수행
- 과정
- 연결 객체의 cursor 메서드를 호출해서 sql 실행 객체를 가져온다.
- sql 실행 객체.execute(sql 문장)
- 연결 객체에서 commit()을 호출하면 반영되고 rollback()을 호출하면 취소
데이터 삽입
# sql 실행 객체 생성
cursor = con.cursor()
# 삽입 실행 (statement 방식)
cursor.execute("insert into usertbl values('ljy', '이진연', 1970, '서울', '01012345678', '1970-10-31')")
con.commit()
con.close()
5. 조회
(조회할 땐 commit이 필요 없음)
- fetchone: 하나의 데이터를 조회하는 함수- tuple 리턴
- fetchall: 0개 이상의 데이터를 조회하는 함수- tuple의 tuple 리턴
# 조회 구문 실행
cursor.execute("select * from usertbl")
# 데이터 1개 가져오기
data = cursor.fetchone()
print(type(data))
# type 없으면 ('kty', '김태연', 1989, '전주', '01011111111', datetime.date(1989, 3, 9))
# type 넣었으니 결과는 <class 'tuple'>
(참고: 튜플은 데이터를 수정할 수 없다. list는 column, tuple은 row)
# 여러 개 가져오기
datas = cursor.fetchall()
for data in datas:
print(data)
6. 프로시저
- 관계형 데이터베이스(RDBMS)에서 사용하는, 절차적 프로그래밍을 위한 개체
- 사용하는 이유
- 보안: 개발자에게 데이터베이스 구조를 알려주지 않고 DML 작업이 가능하도록 한다.
- 속도: 프로시저랑 뷰는 캐싱을 하기 때문에 속도가 빨라진다. (뷰랑 프로시저는 한 번 불러들이면 Main Memory에 저장되어 있는다.)
DELIMITER //
create procedure myproc(
vuserid char(15),
vname varchar(20),
vbirthyear int(11),
vaddr char(100),
vmobile char(11),
vmdate date)
begin
insert into usertbl
values(vuserid, vname, vbirthyear, vaddr, vmobile, vmdate);
end //
DELIMITER ;
# 사용 방법
call myproc('BoA', '권보아', 1986, '남양주', '01012345678', '1986-11-05');
select * from usertbl;
- 프로시저 호출하면 begin절이 수행된다.
728x90
반응형