databases_demo / app.py
raaraya's picture
Upload 9 files
e93cb8f
import streamlit as st
from PIL import Image
import pathlib
import platform
from BeautifulSoup import BeautifulSoup_st
from MechanicalSoup import MechanicalSoup_st
from pandas_html import df_html
from PostgreSQL import SQL
from Mysql import MySQL
from sql_lite import sqlite
st.write('''
# DATABASES
En esta DEMO me centré en desarrollar herramientas útiles para la extracción
y almacenamiento de datos. Así, al inicio se introducen 3 bibliotecas
que normalmente son utilizadas para la extracción de datos contenidos
en páginas web y, al final, se presentan programas de SQL que más comúnmente
son usados para el tratamiento y almacenamiento de datos.
**Notas**:
- Las bibliotecas de SQL se encuentran desarrolladas para trabajar con servidores
remotos (con la excepción de SQLite).
- El apartado de PostgreSQL se encuentra conectado remotamente a mi cuenta de Heroku.
- El apartado de MySQL se encuentra conectado remotamente a mi cuenta de freesqldatabase.
- El apartado de SQLite utiliza internamente un archivo de extensión .db como base de datos.
- Si se desea trabajar los datos de manera local (localhost) se recomienda clonar el siguiente
repositorio (https://github.com/raaraya1/Databases) y ejecutar la aplicación de streamlit
desde la línea de comandos. (**recordar tener activados los servicios de postgresql o mysql según corresponda**)
''')
# methods to extract data from internet
st.write('''
## Web Scraping
''')
extract_choice = st.sidebar.selectbox('Web Scraping',
options=['BeautifulSoup',
'MechanicalSoup',
'Pandas (read_html)'])
if extract_choice == 'BeautifulSoup':
navigation = BeautifulSoup_st()
with st.expander('Cargar pagina web'):
c1, c2 = st.columns([1, 2])
c1.write('''### BeautifulSoup''')
url = c2.text_input('URL')
if url != '':
navigation.load_page(f'{url}')
with st.expander('Filtrar contenido'):
navigation.filter_content()
with st.expander('Guardar'):
navigation.save()
elif extract_choice == 'MechanicalSoup':
navigation = MechanicalSoup_st()
with st.expander('Cargar pagina web'):
c1, c2 = st.columns([1, 2])
c1.write('''### MechanicalSoup''')
url = c2.text_input('URL')
if url != '':
navigation.load_page(f'{url}')
with st.expander('Filtrar contenido'):
navigation.filter_content()
with st.expander('Guardar'):
navigation.save()
elif extract_choice == 'Pandas (read_html)':
navigation = df_html()
with st.expander('Cargar pagina web'):
c1, c2 = st.columns([1, 2])
c1.write('''### Pandas (read_html)''')
url = c2.text_input('URL')
if url != '':
with st.expander('Tablas encontradas'):
navigation.load_page(f'{url}')
with st.expander('Guardar'):
navigation.save()
# Methods to preproced data
st.write('''
## Structured Query Language (SQL)''')
work_choice = st.sidebar.selectbox('Structured Query Language (SQL)',
options=['PostgreSQL',
'MySQL',
'SQLite'])
with st.expander('Conectar con una base de datos'):
if work_choice == 'PostgreSQL':
c1, c2 = st.columns([1, 1])
img_logo = Image.open('img/PostgreSQL.png').resize((200, 200))
c1.write('''#### PostgreSQL''')
c1.image(img_logo)
choice = st.radio('Conectar base de datos:', ['Externa', 'Interna'])
if choice == 'Interna':
database_name = st.secrets["postgres"]["dbname"]
user_name = st.secrets["postgres"]["user"]
password = st.secrets["postgres"]["password"]
host = st.secrets["postgres"]["host"]
port = st.secrets["postgres"]["port"]
Postgre = SQL(database_name, user_name, password, host, port)
elif choice == 'Externa':
host = c2.text_input('Nombre del host')
port = c2.text_input('Puerto')
database_name = c2.text_input('Nombre de la base de datos')
user_name = c2.text_input('Nombre de usuario')
password = c2.text_input('Contraseña')
elif work_choice == 'MySQL':
c1, c2 = st.columns([1, 1])
img_logo = Image.open('img/MySQL.png').resize((200, 200))
c1.write('''#### MySQL''')
c1.image(img_logo)
choice = st.radio('Conectar base de datos:', ['Externa', 'Interna'])
if choice == 'Interna':
database_name = st.secrets["mysql"]["dbname"]
user_name = st.secrets["mysql"]["user"]
password = st.secrets["mysql"]["password"]
host = st.secrets["mysql"]["host"]
port = st.secrets["mysql"]["port"]
Postgre = SQL(database_name, user_name, password, host, port)
elif choice == 'Externa':
host = c2.text_input('Nombre del host')
port = c2.text_input('Puerto')
database_name = c2.text_input('Nombre de la base de datos')
user_name = c2.text_input('Nombre de usuario')
password = c2.text_input('Contraseña')
elif work_choice == 'SQLite':
c1, c2 = st.columns([1, 3])
img_logo = Image.open('img/SQLite.png').resize((160, 100))
c1.image(img_logo)
choice = st.radio('Conectar base de datos:', ['Externa', 'Interna'])
database_path = None
if choice == 'Interna': database_path = 'database.db'
if work_choice == 'PostgreSQL':
if database_name != '' and user_name != '' and password != '' and host != '' and port != '':
Postgre = SQL(database_name, user_name, password, host, port)
with st.expander('Tablas cargadas'):
c1, c2, c3, c4 = st.columns([2, 1, 1, 1])
mostrar_tablas = c1.checkbox('Mostrar tablas', key='mostrar')
Importar_tabla = c2.checkbox('Importar tabla', key='importar')
Eliminar_tabla = c2.checkbox('Eliminar tabla', key='eliminar')
Primary_key = c3.checkbox('Primary Key', key='primary_key')
Foreign_Key = c3.checkbox('Foreign Key', key='foreign_key')
Change_type = c4.checkbox('Tipo columna', key='type_col')
c1, c2 = st.columns(2)
with c1.container():
if mostrar_tablas: Postgre.todas_las_tablas()
with c2.container():
if Importar_tabla: Postgre.importar_tabla()
elif Eliminar_tabla: Postgre.eliminar_tabla()
elif Primary_key: Postgre.primary_key_st()
elif Change_type: Postgre.change_datatype_st()
if Foreign_Key: Postgre.foreign_key_st()
with st.expander('Ejecutar un comando'):
comand = str(st.text_area('Comando de SQL'))
if comand != '': Postgre.mostrar_tabla(comand)
elif work_choice == 'MySQL':
if database_name != '' and user_name != '' and password != '' and host != '' and port != '':
mysql = MySQL(database_name, user_name, password, host, port)
with st.expander('Tablas cargadas'):
c1, c2, c3, c4 = st.columns([2, 1, 1, 1])
mostrar_tablas = c1.checkbox('Mostrar tablas', key='mostrar')
Importar_tabla = c2.checkbox('Importar tabla', key='importar')
Eliminar_tabla = c2.checkbox('Eliminar tabla', key='eliminar')
Primary_key = c3.checkbox('Primary Key', key='primary_key')
Foreign_Key = c3.checkbox('Foreign Key', key='foreign_key')
Change_type = c4.checkbox('Tipo columna', key='type_col')
c1, c2 = st.columns(2)
with c1.container():
if mostrar_tablas: mysql.todas_las_tablas()
with c2.container():
if Importar_tabla: mysql.importar_tabla()
elif Eliminar_tabla: mysql.eliminar_tabla()
elif Primary_key: mysql.primary_key_st()
elif Change_type: mysql.change_datatype_st()
if Foreign_Key: mysql.foreign_key_st()
with st.expander('Ejecutar un comando'):
comand = str(st.text_area('Comando de SQL'))
if comand != '': mysql.mostrar_tabla(comand)
elif work_choice == 'SQLite':
# NOTA:
# sqlite no deja modificar las tablas, por eso lo que hay que hacer es
# copiar la info, crear una nueva tabla (con las modificaciones) y luego hacer los
# cambios. Esto metodo lo voy a hacer para establecer las primary key y las
# Foreign keys
if database_path != '':
SQLITE = sqlite(database_path)
with st.expander('Tablas cargadas'):
c1, c2, c3, c4 = st.columns([2, 1, 1, 1])
mostrar_tablas = c1.checkbox('Mostrar tablas', key='mostrar')
Importar_tabla = c2.checkbox('Importar tabla', key='importar')
Eliminar_tabla = c2.checkbox('Eliminar tabla', key='eliminar')
Primary_key = c3.checkbox('Primary Key', key='primary_key')
Foreign_Key = c3.checkbox('Foreign Key', key='foreign_key')
Change_type = c4.checkbox('Tipo columna', key='type_col')
c1, c2 = st.columns(2)
with c1.container():
if mostrar_tablas: SQLITE.todas_las_tablas()
with c2.container():
if Importar_tabla: SQLITE.importar_tabla()
elif Eliminar_tabla: SQLITE.eliminar_tabla()
elif Primary_key: SQLITE.primary_key_st()
elif Change_type: SQLITE.change_datatype_st()
if Foreign_Key: SQLITE.foreign_key_st()
with st.expander('Ejecutar un comando'):
comand = str(st.text_area('Comando de SQL'))
if comand != '': SQLITE.mostrar_tabla(comand)