diff --git a/data.db b/data.db index a0de274..ade5f64 100644 Binary files a/data.db and b/data.db differ diff --git a/db_utils.py b/db_utils.py index 4c2f1bb..2c5c8fd 100644 --- a/db_utils.py +++ b/db_utils.py @@ -1,11 +1,13 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- +from typing import Generator + from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.orm import declarative_base, sessionmaker Base = declarative_base() # 创建 SQLite 数据库引擎 -engine = create_engine('sqlite:///data.db', echo=False) +engine = create_engine('sqlite:///data.db', echo=True) class BatchData(Base): @@ -27,3 +29,11 @@ Base.metadata.create_all(engine) Session = sessionmaker(bind=engine, ) session = Session() + + +def get_session() -> Generator: + try: + db = Session() + yield db + finally: + db.close() diff --git a/main.py b/main.py index a8273a6..3e9b57a 100644 --- a/main.py +++ b/main.py @@ -1,16 +1,50 @@ # streamlit_app.py import pandas as pd import streamlit as st +from loguru import logger from bak.init_data import BatchDataRead -from db_utils import BatchData, session +from db_utils import BatchData, get_session -df = pd.DataFrame( - data=(BatchDataRead.from_orm(db_obj).dict() - for db_obj in session.query(BatchData).all()) -) +st.session_state.setdefault('data_table', []) -edited_df = st.data_editor(df) # 👈 An editable dataframe + +def get_data_from_db(): + logger.info("init") + return (BatchDataRead.from_orm(db_obj).dict() + for db_obj in next(get_session()).query(BatchData).all()) + + +# logger.debug(st.session_state.data_table) +# if not st.session_state.data_table: +st.session_state.data_table = get_data_from_db() + +df = pd.DataFrame(data=st.session_state.data_table) + + +def update_handler(*args, **kwargs): + logger.debug(f"{args=}, {kwargs=}") + + +edited_df = st.data_editor(df, key="edited_info", + hide_index=True, + on_change=update_handler, + column_order=('id', 'year', 'is_validation'), + use_container_width=True) # 👈 An editable dataframe favorite_command = edited_df.loc[edited_df["id"].idxmax()] -st.markdown(f"Your favorite command is **{favorite_command}** 🎈") +data_table_change_info = st.session_state['edited_info'] +logger.debug(f"{data_table_change_info=}") + +edited_rows = data_table_change_info.get('edited_rows') +session = next(get_session()) +for id_, update_data in edited_rows.items(): + row_db = session.query(BatchData).where(BatchData.id == id_).first() + for field in update_data: + setattr(row_db, field, update_data[field]) + session.add(row_db) + session.commit() + # logger.info(f"{BatchDataRead.from_orm(row_db)}") + st.text(f"update: {id_=}, {update_data=}") + +logger.info('end')