dbms / app.py
deepanshudey's picture
Add application file
91ede3b
# This page allows the user to view a list of members
# By default, the output will be a streamlit rendered pandas dataframe
# But there is also an option to render the output in raw HTML so that
# the member's profile URL can be visited by clicking on the
# "Profile" hyperlink that is only available in the raw HTML version.
import psycopg2
import os
import pandas as pd
import streamlit as st
# Obtain username/password saved as environment variables
user = 'project'
pwd = 'project'
# @st.cache prevents the streamlit app from executing redundant processes
# repeatedly that are expensive such as database connections or reading input
@st.cache(allow_output_mutation=True)
def get_query_results():
""" A function that returns a table of members.
Until streamlit provides a way to pageinate results,
maximum of 1000 rows will be returned.
Output can be either a streamlit rendered dataframe
or raw HTML version. Raw HTML version will provide
a hyperlink that will take you directly to the person's
company profile page. This can be used to double-check
that the profile URL has been correctly generated.
"""
# Connect to the PostgreSQL database server
with psycopg2.connect(host='127.0.0.1',
port='5433',
database='project',
user=user,
password=pwd) as conn:
sql = """
SELECT
*
FROM
public.basic_member_info
ORDER BY
last_name
LIMIT 1000
"""
# Execute query and return results as a pandas dataframe
df = pd.read_sql(sql, conn, index_col=None)
# Define a function to create a "Profile" hyperlink
def createProfileHref(url: str):
""" Function to create a new column that converts URL as HTML hyperlink """
value = '<a href="' + url + '"' + "/>Profile</a>"
return value
# Apply the function we created above and create our new hyperlink column
df['profile_href'] = df['web_url'].apply(createProfileHref)
# Change order of dataframe columns
df = df[['profile_href', 'first_name', 'last_name', 'web_id',
'web_url', 'is_ahm']]
return df
##
def write():
""" Writes content to the app """
st.title("Get Members Data from PostgreSQL")
# Check to see if checkbox was checked or not (boolean) and will be used to
# determine if the output should be a streamlit dataframe or raw HTML.
html = st.checkbox(
'OPTIONAL: Render output as raw html to access the \"Profile\" hyperlink. ' +
'Otherwise, just click on Execute botton.',
False)
# Define what happens when user clicks on the "Execute" button
if st.button("Execute"):
'''
### Query results:
'''
if html:
# Render or display the raw HTML version of the dataframe
st.write(get_query_results().to_html(escape=False, index=False), unsafe_allow_html=True)
else:
# Render or display the streamlit dataframe
st.dataframe(get_query_results())
if __name__ == "__main__":
write()