Mysql and st.data_editor: help request

I have the following code:

conn = connect_to_mysql(.......)
            if conn is None:
                return
            # Esegui la query e visualizza i risultati
            cursor = conn.cursor()
            cursor.execute("SELECT idtitolo, titolo, ticker, idpaese FROM outputdb.tbtitoli ORDER BY titolo ASC")
            data = cursor.fetchall()
            columns = [col[0] for col in cursor.description]
            df = pd.DataFrame(data, columns=columns)
            
            # Visualizza i dati in un editor di dati Streamlit
            edited_df = st.data_editor(df,height=800,width=1200)
            
            # Salva le modifiche apportate alla tabella
            if st.button("Salva modifiche"):
                # Aggiorna i dati nel database
                for index, row in edited_df.iterrows():
                    query = "UPDATE outputdb.tbtitoli SET titolo=%s, ticker=%s, idpaese=%s WHERE idtitolo=%s"
                    values = (row['titolo'], row['ticker'], row['idpaese'], row['idtitolo'])
                    cursor.execute(query, values)
                conn.commit()
                st.write("Modifiche alla lista titoli salvate con successo!")
                # Chiudi la connessione al database
                conn.close()

i have the foollowing question about this component:

  1. is it possible upgrade id paese column to visualize combobox with all tbpaesi datas?
  2. is it possible to automatically autosize the colums?

combobox would visualize data with query ‘select * from tbpaesi order by paese’, and the column tbpaesi.idpaese should be linked to tbtitoli.idpaese.

Use a SelectboxColumn.

Corrected code:

import streamlit as st
import pandas as pd
import mysql.connector

def connect_to_mysql(host, port, username, password, database):
    try:
        conn = mysql.connector.connect(
            host=host,
            user=username,
            port=port,
            password=password,
            database=database
        )
        return conn
    except mysql.connector.Error as e:
        st.error(f"Errore durante la connessione al database: {e}")
        return None

def titoli():
    with st.container():
        col1, col2, col3 = st.columns([1, 1, 1])
        
        with col1:
            option = st.selectbox(
                "Scegli tabella da modificare",
                ("Titoli","Paesi","Watchlists","Sub-Watchlists"),
                index=None,
                placeholder="Seleziona..",
            )
            
    if option=="Titoli":
        conn = connect_to_mysql(......)
        if conn is None:
            return
        
        # Esegui la query e visualizza i risultati
        cursor = conn.cursor()
        cursor.execute("SELECT idtitolo, titolo, ticker, idpaese FROM outputdb.tbtitoli ORDER BY titolo ASC")
        data = cursor.fetchall()
        columns = [col[0] for col in cursor.description]
        df = pd.DataFrame(data, columns=columns)
        
        # Ottieni i nomi dei paesi
        cursor.execute("SELECT idpaese, paese FROM outputdb.tbpaesi ORDER BY paese ASC")
        data2 = cursor.fetchall()
        columns = [col[0] for col in cursor.description]
        df2 = pd.DataFrame(data2, columns=columns)
        dic = {row['idpaese']: row['paese'] for _, row in df2.iterrows()}
        
        # Aggiungi una nuova colonna al dataframe df con il nome del paese
        df['paese'] = df['idpaese'].map(dic)
        
        # Visualizza i dati in un editor di dati Streamlit
        edited_df = st.data_editor(
            df,
            column_config={
                "idpaese": st.column_config.Column(
                "idpaese",
                width=0),
                "paese": st.column_config.SelectboxColumn(
                    "paese ...",
                    help="Il paese di emissione",
                    width="medium",
                    options=df2['paese'].unique(),
                    default=df2['paese'].iloc[0],
                    required=True,
                )
            },
            height=800,
            width=800
        )
        
        # Salva le modifiche apportate alla tabella
        if st.button("Salva modifiche"):
            # Aggiorna i dati nel database
            for index, row in edited_df.iterrows():
                # Ottieni l'ID del paese selezionato
                selected_paese = row['paese']
                paese_id = [k for k, v in dic.items() if v == selected_paese][0]
                
                query = "UPDATE outputdb.tbtitoli SET titolo=%s, ticker=%s, idpaese=%s WHERE idtitolo=%s"
                values = (row['titolo'], row['ticker'], paese_id, row['idtitolo'])
                cursor.execute(query, values)
            conn.commit()
            st.write("Modifiche alla lista titoli salvate con successo!")
            conn.close()

    if option=="Paesi":
            conn = connect_to_mysql(...........)
            if conn is None:
                return
            # Esegui la query e visualizza i risultati
            cursor = conn.cursor()
            cursor.execute("SELECT idpaese, paese FROM outputdb.tbpaesi ORDER BY paese ASC")
            data = cursor.fetchall()
            columns = [col[0] for col in cursor.description]
            df = pd.DataFrame(data, columns=columns)
            
            # Visualizza i dati in un editor di dati Streamlit
            edited_df = st.data_editor(df,height=800,width=600)
            
            # Salva le modifiche apportate alla tabella
            if st.button("Salva modifiche"):
                # Aggiorna i dati nel database
                for index, row in edited_df.iterrows():
                    query = "UPDATE outputdb.tbpaesi SET paese=%s WHERE idpaese=%s"
                    values = (row['paese'], row['idpaese'])
                    cursor.execute(query, values)
                conn.commit()
                st.write("Modifiche ai paesi salvate con successo!")
                # Chiudi la connessione al database
                conn.close()



    if option=="Watchlists":
        conn = connect_to_mysql(..............)
        if conn is None:
            return
        # Esegui la query e visualizza i risultati
        cursor = conn.cursor()
        cursor.execute("SELECT idlista, lista, Excel, bardescr, Nota, flag FROM outputdb.tbliste")
        data = cursor.fetchall()
        columns = [col[0] for col in cursor.description]
        df = pd.DataFrame(data, columns=columns)

        # Visualizza i dati in un editor di dati Streamlit
        edited_df = st.data_editor(df,
            height=800,
            width=1200
            )
            
        # Salva le modifiche apportate alla tabella
        if st.button("Salva modifiche"):
            # Aggiorna i dati nel database
            for index, row in edited_df.iterrows():
                query = "UPDATE outputdb.tbliste SET lista=%s, Excel=%s, bardescr=%s, Nota=%s, flag=%s WHERE idlista=%s"
                values = (row['lista'], row['Excel'], row['bardescr'], row['Nota'], row['flag'], row['idlista'])
                cursor.execute(query, values)
            conn.commit()
            st.write("Modifiche alla Watchlists salvate con successo!")
            # Chiudi la connessione al database
            conn.close()

    if option=="Sub-Watchlists":
        conn = connect_to_mysql(........................')
        if conn is None:
            return
        # Esegui la query e visualizza i risultati
        cursor = conn.cursor()
        cursor.execute("SELECT idslista, idlista, idtitolo FROM outputdb.tbsliste")
        data = cursor.fetchall()
        columns = [col[0] for col in cursor.description]
        df = pd.DataFrame(data, columns=columns)

        # Ottengo i nomi dei titoli
        cursor.execute("SELECT idtitolo, titolo FROM outputdb.tbtitoli")
        data2 = cursor.fetchall()
        columns = [col[0] for col in cursor.description]
        df2 = pd.DataFrame(data2, columns=columns)
        dic = {row['idtitolo']: row['titolo'] for _, row in df2.iterrows()}
    
        # Aggiungi una nuova colonna al dataframe df con il nome del titolo
        df['titolo'] = df['idtitolo'].map(dic)
        
        # Visualizza i dati in un editor di dati Streamlit
        edited_df = st.data_editor(
            df,
            column_config={
                "titolo": st.column_config.SelectboxColumn(
                    "titolo ...",
                    help="Il titolo",
                    width="medium",
                    options=df2['titolo'].unique(),
                    default=df2['titolo'].iloc[0],
                    required=True,
                )
            },
            height=800,
            width=800
        )
    
        # Salva le modifiche apportate alla tabella
        if st.button("Salva modifiche"):
            # Aggiorna i dati nel database
            for index, row in edited_df.iterrows():
                # Ottieni l'ID del titolo selezionato
                selected_titolo = row['titolo']
                titolo_id = [k for k, v in dic.items() if v == selected_titolo][0]
                query = "UPDATE outputdb.tbsliste SET idlista=%s, idtitolo=%s WHERE idslista=%s"
                values = (row['idlista'], titolo_id, row['idslista'])
            cursor.execute(query, values)
            conn.commit()
            st.write("Modifiche alla Sub-Watchlists salvate con successo!")
            # Chiudi la connessione al database
            conn.close()

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.