티스토리 뷰

728x90

현업에서 마스터 데이터를 일괄로 업로드 하여 변경하기를 원할 때가 있습니다.

이럴 때 사전에 정해진 포맷 규칙을 잡고 CSV 또는 Excel 파일로 업로드를 한다면 현업의 입장에서 업무하기가 한결 편해집니다.

 

아래 포스팅은 Flask에서 CSV 파일을 클라이언트에서 선택하여, 

이를 특정 폴더에 복사 후 이것을 pandas 라이브러리로 읽어 DBMS에 insert 하는 코드입니다.

pandas의 성능이 몇 건 까지 처리를 해줄 지 아직 실험해 보지 않았으나, 몇 건 안되는 파일은 아주 처리가 잘 됩니다.

 

@bp.route('/upload/', methods=('GET', 'POST'))
def upload():
    if request.method == 'POST':
        #파일을 특정경로에 저장시킨다.
        f = request.files['file']
        uploaded_file = os.path.join(cf.UPLOAD_FOLDER, secure_filename(f.filename))
        f.save(uploaded_file)

        # pandas를 이용하여 csv파일을 읽어온다.
        data = pd.read_csv(uploaded_file, header=0, encoding='euc-kr')
        # SQLite3 DB로 저장하기
        db_path = os.path.join('C:\projects\myproject', 'pybo.db')
        engine = create_engine('sqlite:///{}'.format(db_path), echo=True, isolation_level="AUTOCOMMIT")
        sqlite_connection = engine.connect()

        #파일 업로드 시 테이블을 지우도 다시 올리는 개념
        conn = engine.raw_connection()
        conn.execute("delete from moduleinfo")
        conn.close()

        sqlite_table = 'tabl_name'
        data.to_sql(sqlite_table, sqlite_connection, if_exists='append', index=True, index_label='id', dtype = {

            'id': sqlalchemy.types.INTEGER()
            #테이블 컬럼 적기
        }
        )
        sqlite_connection.close()
        
        #조회결과 렌더링
        main_list = Maininfo.query.order_by(Maininfo.id.asc())
        return render_template('main/maint_list.html', main_list=main_list)

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함