NameError: name 'conn' is not defined

Bonjour,

c mon voici le code python pour un site que j'essaye de faire avec un Streamlite:

import os
import streamlit as st
import psycopg2
from dotenv import load_dotenv

st.title("Bienvenue sur CertifApp")

def get_db_connection():
    load_dotenv()
    return psycopg2.connect(
                host=os.getenv("DB_HOST", "localhost"),
                port=int(os.getenv("DB_PORT", 5432)),
                dbname=os.getenv("POSTGRES_DB", "Certifapp"),
                user=os.getenv("POSTGRES_USER", "postgres"),
                password=os.getenv("POSTGRES_PASSWORD", "changeMe")
            )

    conn.set_client_encoding('UTF8')

# --- Création des onglets ---
tab1, tab2, tab3 = st.tabs(["Collaborateur", "Certification", "Collaborateur certifié"])

# --- Onglet Collaborateur ---
with tab1:
    st.header("Collaborateur")

    with st.form("ajout_collaborateur"):
        collaborateur_id = st.number_input("ID du collaborateur", min_value=1, step=1, format="%d")
        collaborateur_nom = st.text_input("Nom du collaborateur")
        collaborateur_prenom = st.text_input("Prénom du collaborateur")
        collaborateur_arrivaldate = st.date_input("Date d'arrivée")  # :warning: manquait dans ton code
        collaborateur_email = f"{collaborateur_prenom.lower()}.{collaborateur_nom.lower()}@openvalue.fr"
        referent_technique_id = st.number_input("ID du référent technique", min_value=1, step=1, format="%d")
        certification_recues_id = st.number_input("ID de la certification reçue", min_value=1, step=1, format="%d")

        submitted = st.form_submit_button("Ajouter le collaborateur")


        if submitted:
            conn = None
            try:
                conn = get_db_connection()
                cur = conn.cursor()

                cur.execute("...")
                conn.commit()

            except Exception as e:
                if conn:
                    conn.rollback()
                st.error(f"Erreur : {e}")
    

quand je rentre des données aléatoire; l erreur du titre apparait

que faire ? merci
Windows / Chrome 144.0.0.0it

4 réponses

  1. Modérateur

    Bonjour,

    Une remarque, en 18, dans la fonction, conn n'existe pas puisque la variable est créée en 40 et valorisée en 42 par la fonction. En plus cette ligne 18 ne devrait pas être atteinte, le return terminant la fonction.


    0
    1. Salut,

      Il y a également un autre problème c'est que la connexion n'est jamais fermée, il n'y a nulle part:

      conn.close()
      0
      1. Bonjour, j'ai vu et j'ai corrigé les problèmes que vous avez mentionné avant, et je vous remercie. Malheureusement, le problème semble persister

        import os
        import streamlit as st
        import psycopg2
        from dotenv import load_dotenv
        
        st.title("Bienvenue sur CertifApp")
        
        def get_db_connection():
            load_dotenv()
            conn = psycopg2.connect(
                host=os.getenv("DB_HOST", "localhost"),
                port=int(os.getenv("DB_PORT", 5432)),
                dbname=os.getenv("POSTGRES_DB", "Certifapp"),
                user=os.getenv("POSTGRES_USER", "postgres"),
                password=os.getenv("POSTGRES_PASSWORD", "changeMe")
            )
            conn.set_client_encoding('UTF8')
            return conn
        
        # --- Création des onglets ---
        tab1, tab2, tab3 = st.tabs(["Collaborateur", "Certification", "Collaborateur certifié"])
        
        # --- Onglet Collaborateur ---
        with tab1:
            st.header("Collaborateur")
        
            with st.form("ajout_collaborateur"):
                collaborateur_id = st.number_input("ID du collaborateur", min_value=1, step=1, format="%d")
                collaborateur_nom = st.text_input("Nom du collaborateur")
                collaborateur_prenom = st.text_input("Prénom du collaborateur")
                collaborateur_arrivaldate = st.date_input("Date d'arrivée")  # :warning: manquait dans ton code
                collaborateur_email = f"{collaborateur_prenom.lower()}.{collaborateur_nom.lower()}@openvalue.fr"
                referent_technique_id = st.number_input("ID du référent technique", min_value=1, step=1, format="%d")
                certification_recues_id = st.number_input("ID de la certification reçue", min_value=1, step=1, format="%d")
        
                submitted = st.form_submit_button("Ajouter le collaborateur")
        
                if submitted:
                    conn = get_db_connection()
                    cursor = conn.cursor()
        
                    cursor.execute(
                        "INSERT INTO collaborateur (id, nom, prenom, arrivaldate, email, referent_technique_id, certification_recues_id) "
                        "VALUES (%s, %s, %s, %s, %s, %s, %s)",
                        (collaborateur_id, collaborateur_nom, collaborateur_prenom, collaborateur_arrivaldate, collaborateur_email, referent_technique_id, certification_recues_id)
                    )
        
                    conn.commit()
                    cursor.close()
                    conn.close()
        0
        1. Pour être sur que conn ne soit pas en dehors son scope modifie cette partie :

          if submitted:
              try:
                  with get_db_connection() as conn:
                      with conn.cursor() as cursor:
                          cursor.execute(
                          "INSERT INTO collaborateur (id, nom, prenom, arrivaldate, email, referent_technique_id, certification_recues_id) "
                          "VALUES (%s, %s, %s, %s, %s, %s, %s)",
                          (collaborateur_id, collaborateur_nom, collaborateur_prenom, collaborateur_arrivaldate, collaborateur_email, referent_technique_id, certification_recues_id)
                      )
                  st.success("OK")
              except Exception as e:
                  st.error(e)
          0