NameError: name 'conn' is not defined

RomainGA Messages postés 130 Date d'inscription   Statut Membre Dernière intervention   -  
Diablo76 Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   -

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

jee pee Messages postés 32025 Date d'inscription   Statut Modérateur Dernière intervention   9 806
 

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
Diablo76 Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   128
 

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
RomainGA Messages postés 130 Date d'inscription   Statut Membre Dernière intervention   6
 

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
Diablo76 Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   128
 

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