2021-03-18

Posted by karais89 on March 18, 2021

크롤링보다는 자동화 쪽에 좀 더 관심이 있음.

41. 파이썬 & 데이터베이스 연동 with Pandas(ORM)

  1. ORM (Object-relational mapping)이란?
  2. Pandas & SQLite3 연동
  3. Pandas & SQLite3 데이터 가공 및 저장, 조회하기
  4. Pandas & MySQL 연동
  5. Pandas & MySQL 데이터 가공 및 저장, 조회하기

pymysql: http://pymysql.readthedocs.io/en/latest/index.html SQLAlchemy : http://docs.sqlalchemy.org/en/latest/dialects/mysql.html

ORM

  • 객체 관계형 매퍼
  • 데이터 베이스 테이블 → 파이썬 클래스(변수) 내부적 처리

sqlite3 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import pandas_datareader.data as web
import pandas as pd
import datetime
import sqlite3

# pandas, pandas_datareader 설치
try:
    with sqlite3.connect('c:/workspace/section5/database/sqlite3.db') as conn:
        # 조회 시작 & 마감날짜
        start = datetime.datetime(2018, 2, 1)
        end = datetime.datetime(2018, 3, 3)

        # naver 정보 호출
        gs = web.DataReader('090430', 'naver', start, end)  # 아모레퍼시픽 주가 읽기

        # 데이터 출력
        print(gs)

        # 인덱스 출력
        print(gs.index)

        # Column 출력
        print(gs['Open'])

        # Row 출력
        print(gs.loc['2018-03-02'])

        # index to column
        gs['Date'] = gs.index

        # 인덱스 재 설정
        gs.index = range(1, (len(gs.index) + 1))

        # 데이터 출력 확인
        print(gs)  # 테이블 생성 -> insert -> commit()

        # pandas to database(to_sql)
        gs.to_sql("AMOLE", conn, if_exists="replace", index=True, index_label="id")  # fail, replace, append

        # commit() 커밋
        conn.commit()

        # pandas read database(read_sql) 전체 조회
        df = pd.read_sql('SELECT * FROM AMOLE', conn, index_col='id')
        print(df)
        
        # pandas read database(read_sql) 조건 조회
        df = pd.read_sql('SELECT * FROM AMOLE WHERE id=? OR id=?', conn, params=(3, 7), index_col='id')
        print(df)
finally:
    print("Dataframe SQL Work Complete!")

MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import pandas_datareader.data as web
import pandas as pd
import datetime
import pymysql
from sqlalchemy import create_engine

# mysqldb 생성
pymysql.install_as_MySQLdb()

# pymysql, sqlalchemy 설치
try:
    # 엔진 생성
    engine = create_engine("mysql+mysqldb://root:123456@localhost/python_app1", encoding='utf-8')
    with engine.connect() as conn:
        # 조회 시작 & 마감날짜
        start = datetime.datetime(2018, 2, 1)
        end = datetime.datetime(2018, 3, 3)

        # naver 정보 호출
        gs = web.DataReader('034120', 'naver', start, end)  # sbs

        # 데이터 출력
        print(gs)

        # 인덱스 출력
        print(gs.index)

        # Column 출력
        print(gs['Open'])

        # Row 출력
        print(gs.loc['2018-03-02'])

        # index to column
        gs['Date'] = gs.index

        # 인덱스 재 설정
        gs.index = range(1, (len(gs.index) + 1))

        # 데이터 출력 확인
        print(gs)  # 테이블 생성 -> insert -> commit()

        # pandas to database(to_sql)
        gs.to_sql("sbs", conn, if_exists="replace", index=True, index_label="id")  # fail, replace, append

        # commit() 커밋
        # conn.commit()

        # pandas read database(read_sql) 전체 조회
        df = pd.read_sql('select * from sbs', conn, index_col='id')
        print(df)

        # pandas read database(read_sql) 조건 조회
        df = pd.read_sql('select * from sbs where id=%s OR id=%s', conn, params=(3, 7), index_col='id')
        print(df)
finally:
    # 엔진 종료
    engine.dispose()
    print("Dataframe SQL Work Complete!")

실습(과제): 본인이 원하는 주식 정보 조회 후 저장 & 조회하기

  • 위 예제에서 번호만 변경하면 해결 가능한 부분.