안녕하세요!
python 데이터분석 CRUD 및 db연결 본문
https://shinyfood.tistory.com/72
[데이터 분석] csv파일 DB에 저장하기
지난 게시물에서는 공공데이터포털에서 받은 csv자료를 내가 필요한 자료로 탈바꿈시켜 새로 저장했다. 이제 이 자료를 DB에 넣는 과정을 해보도록 하자. import pandas as pd 역시 오늘도 등장해주는
shinyfood.tistory.com
지난 게시글인 저장과 이어서보면 좋습니다.
지난 게시글에서 기본적인 조회까지만 해보고 끝냈다.
조회결과가 여러건인 경우
지난시간에 execute(sql) 함수를 이용해서 sql문을 전달하여 정보가 잘전달됐는지를 조회했고, 이제 실제 내용을 조회하자.
sql = " Select * From time_power_demand "
rs_cnt = cur.execute(sql)
rows = cur.fetchall()
rows
이렇게 커서가 가지고있는 모든정보를 rows에 담아 rows를 출력해보면 이렇게 나온다.
즉 커서가 갖고있는 정보를 fetchall을통해 빼와야 조회가 가능하다.
ymd_power_df = pd.DataFrame(rows)
ymd_power_df
이 데이터열들을 데이터프레임화 시키는 함수도 pandas에는 존재한다.
한건 조회하기
sql문에서 여러 조건들을 사용하여 조건에 맞는 컬럼만 조회할 수 있었다. 이를 이용하여 한건을 조회해보자
sql = """
select * From time_power_demand
where ymd = '2021-01-01'
AND time = '1시'
"""
sql
cur.execute(sql)
row = cur.fetchone()
row
이때는 fetchone을 사용한다. all과 다른점은 하나만 조회한다는 점.
{'ymd': '2021-01-01', 'time': '1시', 'power': 64942}
ymd_power_one = pd.DataFrame([row])
ymd_power_one
이것도 마찬가지로 데이터프레임화를 할 수 있는데, 한건이기때문에 []를 이용하여 리스트화 해서 데이터프레임화 해준다.
조회와 마찬가지로 입력 수정 삭제 또한 가능하다.
sql = """
Insert Into time_power_demand(
ymd, time, power
) Values (
'2020-12-31','24시', 1234
)
"""
rs_cnt = cur.execute(sql)
rs_cnt
1
ymd_power_one = pd.DataFrame([row])
ymd_power_one
해당과 마찬가지로 insert into , update와 set, delete from을 이용하면 모두 실행가능하다.
이후 해당 정보들을 이용하여 클래스화 했다.
<DB 프로그램 순서>
1. 데이터베이스 설정 정보 준비
2. DB 접속하기 : 커넥션(connect문)
3. 커서 받아오기 : cursor()
4. 구문 작성하기 :sql(조회, 입력, 수정, 삭제) -- X
5. 구문실행하기 : execute() → 결과 값은 체크 -- △
6. 조회인 경우 커서에서 데이터 추출하기 -- 6,7 △
→ 한건 : fetchone()
→ 여러건: fetchall()
7. 조회결과 데이터프레임 또는 웹페이지에 출력
→ 데이터프레임 : pd.DataFrame([한건]), pd.DataFrame(여러건)
8. 조회가 아닌경우 : 처리 결과 조건으로 확인하기 if "처리성공" else "처리실패" -- △
9. DB 정보 반환하기
- 반환 순서 : 커서 (cursor) > 커넥션 (connection)
이중 X와 △에 관련된것만 클래스화했다.
class PowerClass :
def __init__(self) :
# - 접속 ID or 도메인
self.host = "localhost"
# - 사용자계정
self.user = "gjuser"
# - 패스워드
self.password = "dbdb"
# - 데이터베이스명
self.db = "gjdb"
# - 한글처리
self.charset = "utf8"
# - 조회시 컬럼명을 동시에 보여줄지 여부 설정
self.cursorclass = pymysql.cursors.DictCursor
# - 자동반영
self.autocommit = True
# - DB 접속하기
self.connect()
# -Cursor 생성하기
self.cur_on()
def connect(self) :
try :
self.conn = pymysql.connect(host = self.host,
user = self.user,
password = self.password,
db = self.db,
charset = self.charset,
autocommit = self.autocommit,
cursorclass = self.cursorclass)
print("DB접속 성공 >>> ", conn)
except :
print("DB server Checking...plz")
def cur_on(self) :
### 커서 받아오기
## 커서 = 명령전달 하고 명령받아오고 하는 메신저
self.cur = self.conn.cursor()
return self.cur
def getExecute(self, sql) :
rs_cnt = self.cur.execute(sql)
return rs_cnt
def getSelectAll(self, sql) :
rs_cnt = self.getExecute(sql)
if rs_cnt > 0:
rows = self.cur.fetchall()
rs_df = pd.DataFrame(rows)
else :
rs_df = False
return rs_df
def getselectOne(self, sql) :
rs_cnt = self.getExcute(sql)
if rs_cnt > 0:
rows = self.cur.fetchone()
rs_df = pd.DataFrame([row])
else :
rs_df = False
return rs_df
def disconnect(self) :
try :
self.cur.close()
self.conn.close()
print("안녕히가십시오.")
except :
print("이미 모든 커서와 접속정보가 반납됐습니다.")
def connect 와 def cur_on에 쓰이는 변수들을 def init에서 변수화해서 사용하려고하였으나,
init내부에서 시작하면서 사용하는게 맞다는 결론이 나와서 고쳤다.
변수로 선언한다고해도 빈값으로 선언했었기때문에 함수가 실행되며 빈값을 받아와서 의미가 없었다.
'개발일지 > 데이터 분석' 카테고리의 다른 글
데이터분석 교통데이터 수집 및 가공(2) (0) | 2023.12.04 |
---|---|
데이터분석 교통데이터 수집 및 가공(1) (7) | 2023.11.30 |
[데이터 분석] csv파일 DB에 저장하기 (0) | 2023.11.29 |
[데이터 분석] 데이터 수집하여 파일로 저장해보기 (4) | 2023.11.28 |
python 데이터 수집 및 전처리 (4) | 2023.11.28 |