diff --git a/.env b/.env new file mode 100644 index 0000000..702821a --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +DB_HOST=54.36.188.119 +DB_USER=michel +DB_PASSWORD=#SO2&1nf%mZ@jfh \ No newline at end of file diff --git a/Insertion_tables_Mysql.py b/Insertion_tables_Mysql.py new file mode 100644 index 0000000..e2c21b3 --- /dev/null +++ b/Insertion_tables_Mysql.py @@ -0,0 +1,106 @@ +import streamlit as st +import mysql.connector +from dotenv import load_dotenv +import os +from datetime import datetime + +load_dotenv() + +st.set_page_config(page_title="Insertion planifiée", layout="centered") +st.title("🗓️ Insertion planifiée dans une base MySQL") + +# Charger les identifiants +DB_HOST = os.getenv("DB_HOST") +DB_USER = os.getenv("DB_USER") +DB_PASSWORD = os.getenv("DB_PASSWORD") + +# Connexion sans DB initiale pour lister les bases +@st.cache_data +def get_databases(): + conn = mysql.connector.connect( + host=DB_HOST, + user=DB_USER, + password=DB_PASSWORD + ) + cursor = conn.cursor() + cursor.execute("SHOW DATABASES") + bases = [db[0] for db in cursor.fetchall()] + conn.close() + return bases + +# Connexion avec DB sélectionnée +def connect_to_db(db_name): + return mysql.connector.connect( + host=DB_HOST, + user=DB_USER, + password=DB_PASSWORD, + database=db_name + ) + +# --- Interface principale --- + +base = st.selectbox("Choisir une base de données", get_databases()) +if base: + conn = connect_to_db(base) + cursor = conn.cursor() + + cursor.execute("SHOW TABLES") + tables = [table[0] for table in cursor.fetchall()] + table = st.selectbox("Choisir une table", tables) + + if table: + cursor.execute(f"DESCRIBE {table}") + colonnes = cursor.fetchall() + + # Détection clé primaire + cursor.execute(f"SHOW INDEX FROM {table} WHERE Key_name = 'PRIMARY'") + pk = cursor.fetchone() + primary_key = pk[4] if pk else None + + champ_date_candidates = [col[0] for col in colonnes if "date" in col[1].lower()] + champ_date = st.selectbox("Champ de date", champ_date_candidates) + + nb_mois = st.number_input("Nombre d'insertions mensuelles", 1, 36, 6) + date_depart = st.date_input("Date de départ des insertions", value=datetime.today().date()) + st.subheader("Champs à insérer (hors clé primaire et champ de date)") + champs_choisis = [] + champs_editables = [col for col in colonnes if col[0] != primary_key and col[0] != champ_date] + for col in champs_editables: + if st.checkbox(f"{col[0]} ({col[1]})", value=True): + champs_choisis.append(col[0]) + + with st.form("formulaire_insertion"): + st.markdown("**Valeurs fixes pour les champs cochés**") + valeurs_fixes = {} + for nom in champs_choisis: + val = st.text_input(nom) + valeurs_fixes[nom] = val if val != "" else None + + submit = st.form_submit_button("Insérer") + + try: + cursor = conn.cursor() + insert_count = 0 + + for i in range(nb_mois): + year = date_depart.year + (date_depart.month + i - 1) // 12 + month = (date_depart.month + i - 1) % 12 + 1 + day = min(date_depart.day, 28) + date_cible = datetime(year, month, day).date() + + champs = [champ_date] + list(valeurs_fixes.keys()) + valeurs = [date_cible] + list(valeurs_fixes.values()) + sql = f"INSERT INTO {table} ({', '.join(champs)}) VALUES ({', '.join(['%s'] * len(valeurs))})" + + cursor.execute(sql, valeurs) + insert_count += 1 + + conn.commit() + st.success(f"{insert_count} lignes insérées avec succès dans `{table}`.") + + except Exception as e: + st.error(f"❌ Erreur lors de l’insertion : {e}") + + conn.commit() + st.success(f"{insert_count} lignes insérées avec succès dans `{table}`.") +st.success(f"{insert_count} lignes insérées avec succès.") \ No newline at end of file