Updated Form Fields not saving to the Database and no error is thrown up

Summary

trying to update the members table and insert changes into the audit_trails table but it is not working and not throwing up any error.members data are retrieved correctly, i am working in a local environment

Steps to reproduce

Code snippet:

# Function to retrieve the member's information from the database and update it
def retrieve_member(member_id):
    # Retrieve the member's existing information from the database using their ID
    cursor.execute("SELECT * FROM members WHERE id=?", (member_id,))
    existing_member = cursor.fetchone()

    # If the member is found, display their information and allow updates
    if existing_member:
        # Create a form to wrap the input fields
        with st.form(key="update_form"):
            # Editable fields
            name = st.text_input("Name:", existing_member[1])
            membership_no = st.text_input("Membership No:", existing_member[2])
            gender = st.text_input("Gender:", existing_member[3])
            institute = st.text_input("Institute:", existing_member[4])
            state_chapter = st.text_input("State Chapter:", existing_member[5])
            organization_name = st.text_input("Organization Name:", existing_member[6])
            address = st.text_area("Address:", existing_member[7])
            phone_number = st.text_input("Phone Number:", existing_member[8])
            whatsapp_number = st.text_input("WhatsApp Number:", existing_member[9])
            year_of_induction = st.text_input("Year of Induction:", existing_member[10])
            status_grade = st.text_input("Status Grade:", existing_member[11])
            email_address = st.text_input("Email Address:", existing_member[12])
            state_residing = st.text_input("State Residing:", existing_member[13])
            dateofbirth = st.text_input("Date of Birth:", existing_member[16])  # Display and edit Date of Birth
            acronyms = st.text_input("Acronyms:", existing_member[17])

            # Editable passport field
            uploaded_file = st.file_uploader("Upload Passport Photo:", type=["jpg", "jpeg", "png"], key="passport")

            if uploaded_file is not None:
                # Display the uploaded passport photo
                passport_image = Image.open(uploaded_file)
                st.image(passport_image, caption="Uploaded Passport Photo", use_column_width=True)

            # Add a button to save the updated information
            if st.form_submit_button("Save"):
                save_member(member_id, existing_member, name, membership_no, gender, institute, state_chapter,
                            organization_name, address, phone_number, whatsapp_number, year_of_induction,
                            status_grade, email_address, state_residing, dateofbirth, acronyms, uploaded_file)

# Function to save the updated member information
def save_member(member_id, existing_member, name, membership_no, gender, institute, state_chapter, organization_name,
                address, phone_number, whatsapp_number, year_of_induction, status_grade,
                email_address, state_residing, dateofbirth, acronyms, uploaded_file):
    
    try:
        # Check if any required field is empty
        if any(value == '' for value in [name, membership_no, gender, institute, state_chapter, organization_name,
                                        address, phone_number, whatsapp_number, year_of_induction, status_grade,
                                        email_address, state_residing, dateofbirth, acronyms]):
            st.error("All fields must be filled")
            return

        # Retrieve the current timestamp
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # Compare each field with the existing member data to identify changes
        changed_fields = {}
        for field_name, new_value, old_value in [
            ("name", name, existing_member[1]),
            ("membership_no", membership_no, existing_member[2]),
            ("gender", gender, existing_member[3]),
            ("institute", institute, existing_member[4]),
            ("state_chapter", state_chapter, existing_member[5]),
            ("organization_name", organization_name, existing_member[6]),
            ("address", address, existing_member[7]),
            ("phone_number", phone_number, existing_member[8]),
            ("whatsapp_number", whatsapp_number, existing_member[9]),
            ("year_of_induction", year_of_induction, existing_member[10]),
            ("status_grade", status_grade, existing_member[11]),
            ("email_address", email_address, existing_member[12]),
            ("state_residing", state_residing, existing_member[13]),
            ("dateofbirth", dateofbirth, existing_member[16]),
            ("acronyms", acronyms, existing_member[17])
        ]:
            if new_value != old_value:
                changed_fields[field_name] = (old_value, new_value)

        # Insert audit trail records for each changed field
        for field_name, (old_value, new_value) in changed_fields.items():
            cursor.execute("INSERT INTO audit_trail (member_id, field_name, old_value, new_value, timestamp) VALUES (?, ?, ?, ?, ?)",
                           (member_id, field_name, str(old_value), str(new_value), timestamp))  # Use str() to convert values to strings

        # Convert the uploaded passport image to a byte array
        passport_blob = None
        if uploaded_file is not None:
            passport_image = Image.open(uploaded_file)
            image_byte_array = io.BytesIO()
            passport_image.save(image_byte_array, format='PNG')
            passport_blob = image_byte_array.getvalue()

        # Update the member's information in the database
        cursor.execute("UPDATE members SET name=?, membership_no=?, gender=?, institute=?, state_chapter=?, "
                       "organization_name=?, address=?, phone_number=?, whatsapp_number=?, year_of_induction=?, "
                       "status_grade=?, email_address=?, state_residing=?, dateofbirth=?, acronyms=?, passport=? WHERE id=?",
                       (name, membership_no, gender, institute, state_chapter, organization_name, address,
                        phone_number, whatsapp_number, year_of_induction, status_grade, email_address,
                        state_residing, dateofbirth, acronyms, passport_blob, member_id))

        # Commit the changes to the database
        connection.commit()

        st.success("Member information updated and saved!")

    except Exception as e:
        st.error(f"Error: {str(e)}")

# Streamlit app
def update_member():
    st.title("Update Member")
    # Add an input field for the member's ID and a search button
    member_id = st.text_input("Member ID:")
    if st.button("Search"):
        retrieve_member(member_id)

update_member()

If applicable, please provide the steps we should take to reproduce the error or specified behavior.

Expected behavior:

update the members table and insert changes into the audit_trails table when save_member funtion runs.

Actual behavior:

No error was thrown up but not working.

Debug info

  • Streamlit version: ( 1.26.0)
  • Python version: (3.11.2)
  • i am using virtualenv
  • OS version: Windows 10 64 bit professional
  • Browser version: Opera GX, Google chrome

@ocha
This is because you haven’t write connection.commit() right after the INSERT Query.
Keep a note that whenever you are try a DML query in a any programming language you have to the commit it after every query(INSERT, UPDATE, DELETE)

thanks for your response, i inserted connection.commit() after the INSERT Query, still nothing happens, please i will appreciate if you can still help me further, i have been on this for almost 24 hours ago

Did you check your db connection ? and if its working ? most of the times we miss out on simple errors…

bro my db connection is ok

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.