• 자세한 설명 감사합니다.

    알려주신대로 파일을 수정하고 다시 돌려보며 하나하나 잡아나가고 있는데요. 막히는 부분이 생기네요. 확인 부탁드리겠습니다.

    제가 했던 작업 순서 입니다.

    1. 알려주신대로 코드 추가 및 수정
    2. 말씀해주신대로 opendart 의 예제를 보면서 응답에 넘어오는 모든 값에 대응하는 컬럼에 대해 매핑 선언
    3. 2번 작업 후 파일 돌리니 에러가 나서 확인 후 'from sqlalchemy.ext.declarative import declarative_base' 코드 추가
    4. 3번 작업 후 파일 돌리니 1054, "Unknown column 'index' in 'field list'" 에러가 나서 인터넷 검색 후 하기와 같이 코드 수정 df.to_sql('dart_fs', self.db_engine, if_exists='append') -> df.to_sql('dart_fs', self.db_engine, if_exists='append', index = False)
    5. 4번 작업 후 파일 돌리니 첫번째 기업인 DSR 부터 1054, "Unknown column 'thstrm_add_amount' in 'field list'" 에러가 남

    인터넷 검색해보니 sql 에서 thstrm_add_amount 라는 컬럼을 인식을 못해서 나는 에러라는 것 까지는 알겠는데
    어떻게 해야 수정이 되는지는 케이스 바이 케이스 라서 해결방법을 찾을 수가 없네요.ㅠ

    코드 수정한 파일과 에러 메세지를 공유드리니 도움 부탁드리겠습니다. dart_api_fs.py 감사합니다.

    하기는 실행창 및 에러 메세지 입니다.

    ====================================

    C:\Users\user\anaconda3\envs\py37_64\python.exe C:/Users/user/PycharmProjects/bot/dart_api_fs.py 2015 start! 2015 년도 ++++++++++++++ DSR ++++++++++++++ 1 / 2207 insert 2015 DSR Traceback (most recent call last): File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\engine\base.py", line 1258, in _execute_context cursor, statement, parameters, context File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\dialects\mysql\mysqldb.py", line 148, in do_executemany rowcount = cursor.executemany(statement, parameters) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 190, in executemany self._get_db().encoding) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 227, in _do_execute_many rows += self.execute(sql + postfix) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 163, in execute result = self._query(query) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 321, in _query conn.query(q) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 505, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 724, in _read_query_result result.read() File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 1069, in read first_packet = self.connection._read_packet() File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 676, in _read_packet packet.raise_for_error() File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\protocol.py", line 223, in raise_for_error err.raise_mysql_exception(self._data) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\err.py", line 107, in raise_mysql_exception raise errorclass(errno, errval) pymysql.err.OperationalError: (1054, "Unknown column 'thstrm_add_amount' in 'field list'")

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last): File "C:/Users/user/PycharmProjects/bot/dart_api_fs.py", line 221, in dartapi.get_recent_5y() File "C:/Users/user/PycharmProjects/bot/dart_api_fs.py", line 215, in get_recent_5y self.get_all_econ_info(date) File "C:/Users/user/PycharmProjects/bot/dart_api_fs.py", line 200, in get_all_econ_info df.to_sql('dart_fs', self.db_engine, if_exists='append', index = False) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pandas\core\generic.py", line 2663, in to_sql method=method, File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pandas\io\sql.py", line 521, in to_sql method=method, File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pandas\io\sql.py", line 1317, in to_sql table.insert(chunksize, method=method) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pandas\io\sql.py", line 755, in insert exec_insert(conn, keys, chunk_iter) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pandas\io\sql.py", line 669, in _execute_insert conn.execute(self.table.insert(), data) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\engine\base.py", line 1014, in execute return meth(self, multiparams, params) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\engine\base.py", line 1133, in _execute_clauseelement distilled_params, File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\engine\base.py", line 1318, in _execute_context e, statement, parameters, cursor, context File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\engine\base.py", line 1512, in handle_dbapi_exception sqlalchemy_exception, with_traceback=exc_info[2], from_=e File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\util\compat.py", line 178, in raise raise exception File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\engine\base.py", line 1258, in _execute_context cursor, statement, parameters, context File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\sqlalchemy\dialects\mysql\mysqldb.py", line 148, in do_executemany rowcount = cursor.executemany(statement, parameters) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 190, in executemany self._get_db().encoding) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 227, in _do_execute_many rows += self.execute(sql + postfix) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 163, in execute result = self._query(query) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\cursors.py", line 321, in _query conn.query(q) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 505, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 724, in _read_query_result result.read() File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 1069, in read first_packet = self.connection._read_packet() File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\connections.py", line 676, in _read_packet packet.raise_for_error() File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\protocol.py", line 223, in raise_for_error err.raise_mysql_exception(self._data) File "C:\Users\user\anaconda3\envs\py37_64\lib\site-packages\pymysql\err.py", line 107, in raise_mysql_exception raise errorclass(errno, errval) sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1054, "Unknown column 'thstrm_add_amount' in 'field list'") [SQL: INSERT INTO dart_fs (rcept_no, reprt_code, bsns_year, corp_code, sj_div, sj_nm, account_id, account_nm, account_detail, thstrm_nm, thstrm_amount, frmtrm_nm, frmtrm_amount, bfefrmtrm_nm, bfefrmtrm_amount, ord, thstrm_add_amount, code, code_name) VALUES (%(rcept_no)s, %(reprt_code)s, %(bsns_year)s, %(corp_code)s, %(sj_div)s, %(sj_nm)s, %(account_id)s, %(account_nm)s, %(account_detail)s, %(thstrm_nm)s, %(thstrm_amount)s, %(frmtrm_nm)s, %(frmtrm_amount)s, %(bfefrmtrm_nm)s, %(bfefrmtrm_amount)s, %(ord)s, %(thstrm_add_amount)s, %(code)s, %(code_name)s)] [parameters: ({'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs_CurrentAssets', 'account_nm': '유동자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 90548009749.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 89445811249.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 85463593354.0, 'ord': '1', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs_CashAndCashEquivalents', 'account_nm': '현금및현금성자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 3646416398.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 656969877.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 4706987241.0, 'ord': '2', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs_OtherCurrentFinancialAssets', 'account_nm': '기타금융자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 127701323.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 403324966.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 3191651296.0, 'ord': '13', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': '-표준계정코드 미사용-', 'account_nm': '매도가능금융자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 7024073068.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 2093397453.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 2210409035.0, 'ord': '21', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': '-표준계정코드 미사용-', 'account_nm': '당기손익인식금융자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 14308206965.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 9073672924.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 6996048456.0, 'ord': '22', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs_TradeAndOtherCurrentReceivables', 'account_nm': '매출채권및기타채권', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 37485906991.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 44728162837.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 41548770855.0, 'ord': '23', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs_OtherCurrentNonfinancialAssets', 'account_nm': '기타유동자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 2001661371.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 2823963767.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 1134267765.0, 'ord': '37', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs_Inventories', 'account_nm': '재고자산', 'account_detail': None, 'thstrm_nm': '제 52 기', 'thstrm_amount': 25954043633.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 29666319425.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 25675458706.0, 'ord': '38', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'} ... displaying 10 of 131 total bound parameter sets ... {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'SCE', 'sj_nm': '자본변동표', 'account_id': 'ifrs_Equity', 'account_nm': '기말자본', 'account_detail': '자본 [member]|자본금 [member]', 'thstrm_nm': '제 52 기', 'thstrm_amount': 8000000000.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 8000000000.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 8000000000.0, 'ord': '19', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'}, {'rcept_no': '20160330001425', 'reprt_code': '11011', 'bsns_year': '2015', 'corp_code': '00110608', 'sj_div': 'SCE', 'sj_nm': '자본변동표', 'account_id': 'ifrs_Equity', 'account_nm': '기말자본', 'account_detail': '자본 [member]|주식발행초과금 [member]', 'thstrm_nm': '제 52 기', 'thstrm_amount': 13702964000.0, 'frmtrm_nm': '제 51 기', 'frmtrm_amount': 13702964000.0, 'bfefrmtrm_nm': '제 50 기', 'bfefrmtrm_amount': 13702964000.0, 'ord': '19', 'thstrm_add_amount': None, 'code': '155660', 'code_name': 'DSR'})] (Background on this error at: http://sqlalche.me/e/13/e3q8)

    Process finished with exit code 1

    ===============================================================================================

    하기는 수정한 코드 입니다.

    ===================================

    dart : http://dart.fss.or.kr/

    오픈Dart: https://opendart.fss.or.kr/

    Dart-fss(라이브러리 문서): https://dart-fss.readthedocs.io/en/latest/

    예제 쿼리 (2015년도 기준, 0 < 2013영업이익 < 2014영업이익 < 2015영업이익 종목

    select * from dart where fs_nm = '재무제표' and bsns_year = '2015' and account_nm ='영업이익' and 0 < bfefrmtrm_amount < frmtrm_amount < thstrm_amount

    (별도, 개별)재무제표 vs 연결재무제표

    (별도, 개별)재무제표

    - 지배기업의 재무정보만 표시 (종속기업이 있는 경우는 별도 재무제표, 없는 경우는 개별 재무제표)

    - 종속기업과 내부거래가 많은 경우 별도재무제표 실적이 확대

    연결재무제표

    - 지배기업과 종속기업의 재무정보를 하나로 합산

    - 계열사를 여러개 거느리고 있고 지분구조도 복잡하게 얽히고 섥힌 기업일수록 연결재무제표가 별도재무제표보다 중요

    - 종속기업, 모기업 간 내부거래를 제거한 재무제표

    - 해당 기업이 외부 고객과 얼마나 거래를 했는지 효과적으로 구분하기 위해 만든 제도

    - 종속기업이 없는 경우는 연결재무제표가 없다 (DB에도 저장 안됨)

    import datetime

    import dart_fss as dart import pymysql import sqlalchemy

    '-' 으로 들어오는 데이터를 null로 바꿔주는 작업을 위해 numpy 추가

    import numpy from dart_fss.errors import NoDataReceived from pandas import *

    from pandas import DataFrame

    from sqlalchemy import create_engine

    새로운 import 들 추가

    from sqlalchemy import BigInteger, Column, Integer, String, create_engine from sqlalchemy.engine.url import URL from sqlalchemy.ext.declarative import declarative_base from library import cf

    pymysql.install_as_MySQLdb()

    여기서부터 새 코드

    Base = declarative_base()

    class DartFs(Base): tablename = 'dart_fs'

    id = Column(Integer, primary_key=True)
    # API의 응답 값에는 없지만 아래에서 종목명을 code_name으로, code 를 code 로 추가하는 코드가 있습니다.
    code_name = Column(String(255), nullable=False)
    code = Column(String(6), nullable=False)
    rcept_no = Column(String(14))
    reprt_code = Column(String(5))
    bsns_year = Column(String(4))
    corp_code = Column(String(8), nullable=False)
    sj_div = Column(String(3))
    sj_nm = Column(String(14))
    account_id = Column(String(100))
    account_nm = Column(String(100))
    account_detail = Column(String(100))
    thstrm_nm = Column(String(20))
    thstrm_amount = Column(BigInteger)
    thstrm_add_amount = Column(BigInteger)
    frmtrm_nm = Column(String(20))
    frmtrm_amount = Column(BigInteger)
    frmtrm_q_nm = Column(String(20))
    frmtrm_q_amount = Column(BigInteger)
    frmtrm_add_amount = Column(BigInteger)
    bfefrmtrm_nm = Column(String(20))
    bfefrmtrm_amount = Column(BigInteger)
    ord = Column(Integer)
    
    
    def __repr__(self):
        return f"<Dart(stock_code='{self.stock_code}', code_name='{self.code_name}')>"

    class DARTApi: def init(self): db_url = URL( drivername="mysql+mysqldb", username=cf.db_id, password=cf.db_passwd, host=cf.db_ip, port=cf.db_port, database='daily_buy_list' ) self.db_engine = create_engine(db_url) # 자신의 Dart API 인증키 입력 dart.set_api_key(cf.dart_api_key) # DART 공시된 회사 리스트 반환 self.crp_list = dart.get_corp_list() # 모든 종목 코드 가져오기 self.get_stock_item_all()

    def get_stock_item_all(self):
        sql = """
           SELECT code, code_name
           FROM stock_item_all
           WHERE code not in (
               SELECT code FROM stock_konex
           )
           """  # Konex 제외 (기업공시 데이터 미제공)
        self.stock_item_all = self.db_engine.execute(sql).fetchall()
    
    # table 존재 여부 확인
    def is_table_exist(self, table_name):
        sql = """
            SELECT 1
            FROM information_schema.tables
            WHERE table_schema = 'daily_buy_list' AND table_name = '{}'
        """.format(table_name)
        rows = self.db_engine.execute(sql).fetchall()
        if len(rows) == 1:
            return True
        elif len(rows) == 0:
            return False
    
    def is_exist_data(self, year, code):
        if self.is_table_exist('dart_fs'):
            sql = "SELECT code FROM dart_fs WHERE bsns_year = '{}' AND code = '{}'".format(year, code)
            rows = self.db_engine.execute(sql).fetchall()
            if rows:
                return True
            else:
                return False
        # table 자체가 없으면 False 반환
        else:
            return False
    
    def get_all_econ_info(self, year):
        print("{} start!".format(year))
        num=len(self.stock_item_all) # print 용 변수
        count=0 # print 용 변수
        for stock_code in self.stock_item_all:
            count += 1
            code = stock_code[0]
            code_name = stock_code[1]
            print("{} 년도 ++++++++++++++ {} ++++++++++++++ {} / {}".format(year, code_name, count, num))
    
            # 데이터가 있으면 넘어가는 로직
            if self.is_exist_data(year, code):
                print("{} 년도 {} 데이터는 이미 존재한다!".format(year, code_name))
                continue
    
            print("insert {} {}".format(year, code_name))
            corp_class = self.crp_list.find_by_stock_code(code)
    
            # corp_class 가 none값 인지 확인
            if corp_class:
                corp_code = corp_class.to_dict()['corp_code']
            else:
                print("{} 의 corp_class 데이터가 조회되지 않습니다.".format(code_name))
                continue
            try:
                """
                dart.api.finance.get_single_fs(corp_code: str, bsns_year: str, reprt_code: str, fs_div: str)
    
                corp_code: corp_code(종목코드가 아님, 공시대상회사의 고유번호(8자리)),
                bsns_year: 연도를(사업연도(4자리))
                reprt_code:
                    1분기보고서 : 11013, 반기보고서 : 110123, 3분기보고서 : 11014, 사업보고서 : 11011
                fs_div: str
                    CFS:연결재무제표, OFS:재무제표
                """
                res = dart.api.finance.get_single_fs(corp_code, str(year), '11011', 'OFS')
    
            except NoDataReceived as e:
                print("{} 년도 {} ({}) 데이터는 조회되지 않습니다.".format(year, code_name, code))
                continue
            df = DataFrame(res['list'])
    
            # # 콤마 제거
            # # 당해 연도
            # df['thstrm_amount'] = df['thstrm_amount'].str.replace(',', '')
            # # 1년 전
            # df['frmtrm_amount'] = df['frmtrm_amount'].str.replace(',', '')
            # # 2년 전
            # df['bfefrmtrm_amount'] = df['bfefrmtrm_amount'].str.replace(',', '')
    
            # 이렇게 한줄로 교체하시면 df의 데이터를 key로 접근하지 않기 때문에, KeyError가 나지 않을것입니다.
            df = df.replace({',': ''}, regex=True)
    
            # - 가 있는 컬럼은 None으로 변경
            # df.loc[df.thstrm_amount == '-', 'thstrm_amount'] = None
            # df.loc[df.frmtrm_amount == '-', 'frmtrm_amount'] = None
            # df.loc[df.bfefrmtrm_amount == '-', 'bfefrmtrm_amount'] = None
    
            #  '-' 으로 들어오는 데이터를 null로 바꿔주는 작업
            df = df.replace('-', numpy.nan)
    
            # stock_code 라는 컬럼명을 code로 변경
            # df = df.rename(columns={'stock_code': 'code'})
    
            # 데이터프레임에 코드명 컬럼이 없어서 새롭게 생성
            df['code'] = code
            df['code_name'] = code_name
    
    
            # 숫자형식에 안맞는 것들이 있다. 숫자형식에 맞추고 안맞는 것은 NaN 처리
            df['thstrm_amount'] = pandas.to_numeric(df['thstrm_amount'], errors='coerce')
            df['frmtrm_amount'] = pandas.to_numeric(df['frmtrm_amount'], errors='coerce')
            df['bfefrmtrm_amount'] = pandas.to_numeric(df['bfefrmtrm_amount'], errors='coerce')
    
    
            df.to_sql('dart_fs', self.db_engine, if_exists='append', index = False)
                    # 모든 컬럼에 대한 적절한 타입을 위에서 선언 해놨으므로 to_sql에서 dtype을 지정해주지 않아도 의도한 타입으로 들어가게 될 겁니다.
                    #   dtype={
                    #       'thstrm_amount': sqlalchemy.types.BIGINT,
                    #       'frmtrm_amount': sqlalchemy.types.BIGINT,
                    #       'bfefrmtrm_amount': sqlalchemy.types.BIGINT,
                    #
                    #   }
                    #  )
    
    
    def get_recent_5y(self):
        # 최근 5년 조회 가능
        this_year = datetime.date.today().year
        for date in range(this_year - 5, this_year):
            self.get_all_econ_info(date)

    if name == "main": dartapi = DARTApi() # 테이블 생성코드 추가 Base.metadata.create_all(dartapi.db_engine) dartapi.get_recent_5y() print("dart_fs 크롤링을 성공적으로 마쳤습니다.")

    =================================================

    • 이상입니다.
  • 데이터베이스를 코드를 수정 하기전 만들어진 상태에서 넣어서 그런것같습니다. MySQL Commandline Client에서 해당 DB에 접속 (\r 데이터베이스이름) 하신 후 (혹은 Datagrip에서 확인하셔도 됩니다.)

    DESC dart_fs;

    를 쳐보시면 해당 테이블의 스키마가 나올텐데 위 코드에서 생성한 모델의 칼럼들과 같은지 확인해보시기 바랍니다. (특히 thstrm_amount라는 칼럼이있는지 확인) 아마 없을텐데 코드 업데이트 이전에 만들어진 테이블이라서 그렇습니다. 테이블을 drop하시고 (datagrip이용하시던지 drop table dart_fs; 로 드랍해주세요) 다시 코드를 실행하시면 제대로 된 테이블을 생성할것입니다.

    또한 df['thstrm_amount'] 이 부분이 에러가 날 가능성이 존재합니다. 만약 api콜에서 thstrm_amount의 값을 안줘버리면 KeyError가 날겁니다. 아래에 frmtrm_amount와 bfefrmtrm_amount도 마찬가지입니다. 꼭 try문으로 세문장 전부 잡아서 except에 KeyError로 처리해주시기 바랍니다.

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment