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. 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
    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. 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. 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