Hi, I’m in a project where I have an algorithm already built the works as a calculator, so what I want to know is if there is any simple way that I can create the input variables on the left, save them in a database and use them to calculate with the algorithm the final result.
import pandas as pd
from pathlib import Path
import sqlite3
from sqlite3 import Connection
import streamlit as st
URI_SQLITE_DB = "test.db"
def main():
st.title("My Super Calculator")
st.markdown("Enter data in database from sidebar, then run the **mighty** calculator")
conn = get_connection(URI_SQLITE_DB)
init_db(conn)
build_sidebar(conn)
display_data(conn)
run_calculator(conn)
def init_db(conn: Connection):
conn.execute(
"""CREATE TABLE IF NOT EXISTS test
(
INPUT1 INT,
INPUT2 INT
);"""
)
conn.commit()
def build_sidebar(conn: Connection):
st.sidebar.header("Configuration")
input1 = st.sidebar.slider("Input 1", 0, 100)
input2 = st.sidebar.slider("Input 2", 0, 100)
if st.sidebar.button("Save to database"):
conn.execute(f"INSERT INTO test (INPUT1, INPUT2) VALUES ({input1}, {input2})")
conn.commit()
def display_data(conn: Connection):
if st.checkbox("Display data in sqlite databse"):
st.dataframe(get_data(conn))
def run_calculator(conn: Connection):
if st.button("Run calculator"):
st.info("Run your function")
df = get_data(conn)
st.write(df.sum())
def get_data(conn: Connection):
df = pd.read_sql("SELECT * FROM test", con=conn)
return df
@st.cache(hash_funcs={Connection: id})
def get_connection(path: str):
"""Put the connection in cache to reuse if path does not change between Streamlit reruns.
NB : https://stackoverflow.com/questions/48218065/programmingerror-sqlite-objects-created-in-a-thread-can-only-be-used-in-that-sa
"""
return sqlite3.connect(path, check_same_thread=False)
if __name__ == "__main__":
main()
(could have put conn=get_connection(URI_SQLITE_DB) in each function where you need it since it’s in cache anyway, you can reorganize as you will)
Talking about the database, my doubt is if can I store the data that every single user put on it, I mean, independently of who and where this user is using the app, is this already enough to store that data and build a consolidated database? Or I should build something to store that in another file, a csv for example?
Thank you very much for your attention, I really appreciate it!!
An actual database is always going to be a more scalable solution than CSV files. In the case of SQLite, you may not be able to use that as a multi-user reading and writing environment (you’d have to look in their docs). But for a database like Postgres or similar, that will scale to hundreds, thousands or even more concurrent users.
Hi andfanilo
Is it work when we run this code on streamlit sharing??
Or you run it on localhost???
If it’s possible, could you help me??
I’ve create a CRUD with streamlit further sqlserver database …i run it on localhost without any problem but in streamlit sharing gets error.
Thanks for stopping by! We use cookies to help us understand how you interact with our website.
By clicking “Accept all”, you consent to our use of cookies. For more information, please see our privacy policy.
Cookie settings
Strictly necessary cookies
These cookies are necessary for the website to function and cannot be switched off. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms.
Performance cookies
These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us understand how visitors move around the site and which pages are most frequently visited.
Functional cookies
These cookies are used to record your choices and settings, maintain your preferences over time and recognize you when you return to our website. These cookies help us to personalize our content for you and remember your preferences.
Targeting cookies
These cookies may be deployed to our site by our advertising partners to build a profile of your interest and provide you with content that is relevant to you, including showing you relevant ads on other websites.