Security_Analysis

진단 Tool 제작_4 (데이터 저장) 본문

현업/[dev]_Python

진단 Tool 제작_4 (데이터 저장)

Positivie 2024. 7. 10. 11:24
728x90
반응형

이제 데이터를 저장해야 한다. 

진단 Tool 제작_3 (데이터 분할 및 데이터 프레임화 코드 변경)

 

DB에 Label 결과가 없는 상태로 1차 저장을 하고 Label 값을 사람이 넣고 난 후에 해당파일을 다시 넣으면 Label을 진행하여 각 현황에 맞는 결과를 DB에 저장한다. DB에 저장을 하기 위해서 코드를 작성했다.

if os_db_path:
            os_conn = sqlite3.connect(os_db_path)
            os_cursor = os_conn.cursor()

            os_cursor.execute('SELECT COUNT(*) FROM processed_files WHERE filename = ?', (file_name,))
            if os_cursor.fetchone()[0] == 0:
                for srv_id, group in all_data.groupby('SRV_ID'):
                    table_name = srv_id.replace('-', '_')
                    os_cursor.execute(f'''
                    CREATE TABLE IF NOT EXISTS {table_name} (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        hostinfo_id INTEGER,
                        Content TEXT,
                        Label TEXT,
                        predict_Label TEXT,
                        FOREIGN KEY (hostinfo_id) REFERENCES hostinfo(id)
                    )
                    ''')
                    group['hostinfo_id'] = hostinfo_id
                    group.drop(columns=['SRV_ID'], inplace=True)
                    group.to_sql(table_name, os_conn, if_exists='append', index=False)
                processed_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                os_cursor.execute('INSERT INTO processed_files (filename, processed_date) VALUES (?, ?)',
                                  (file_name, processed_date))
                print(f"{file_name} 데이터가 {os_db_path}에 추가되었습니다.")
            else:
                print(f"{file_name} 기존 파일이므로 무시")

            os_conn.commit()
            os_conn.close()

id값은 전 게시글에서도 썼지만 자산번호 mapping 하기 위한 용도이며, 

insert 구문을 통해 데이터를 추가하도록 했다.

 

각 항목별 ID 값에 해당하는 테이블이 있고, 각 테이블 안에는 스크립트 결과에서 항목별 Content(내용)이 있다. 

아직 Label은 넣지 않았기 때문에 이런식으로 결과가 있는 상태에서 엑셀 파일에 Label 값을 다 넣고 다시 DB를 업데이트 한다. 

os_conn.execute('BEGIN')

                        for index, row in label_df.iterrows():
                            srv_id = row['SRV_ID']
                            label = row['Label']

                            # OS DB 업데이트
                            table_name = srv_id.replace('-', '_')
                            os_cursor.execute('''
                                UPDATE {} SET Label = ?
                                WHERE hostinfo_id = ?
                            '''.format(table_name), (label, hostinfo_id))

                        # 트랜잭션 커밋
                        os_conn.commit()

 

 

이제 Label 값 까지 전부 들어갔다. 

지금 보여지는 것은 단순 6대 뿐이지만, 테스트 결과가 100대 ~ 1000대 까지 간다면 모델링 학습할 때 더 정확한 결과를 도출해 낼 것이다. 

 

728x90
반응형