NameError: name 'conn' is not defined
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
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.
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()
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()
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)
