Streamlit 是一个 Python 库,可以帮助你在 Web 应用程序中快速构建和展示数据可视化、机器学习模型和其他交互式应用程序。Streamlit 提供了简单易用的 API,可以帮助你快速构建交互式应用程序,无需编写 HTML、CSS 或 JavaScript 代码。
创建 Streamlit 应用程序
创建一个新的 Python 文件,比如 app.py,然后在文件开头导入 Streamlit 库,如下所示:
import streamlit as st:导入 Streamlit 库,用于创建交互式应用程序的用户界面。
import pymysql:导入 PyMySQL 库,用于连接和操作 MySQL 数据库。
import pandas as pd:导入 Pandas 库,用于数据处理和分析,可以方便地读取和处理各种数据源。
import os:导入 os 库,用于访问操作系统功能,如文件操作、环境变量等。
这些库都是 Python 的第三方库,需要提前安装才能使用。在这个例子中,代码使用了 Streamlit 库创建了一个简单的交互式应用程序,使用 PyMySQL 库连接到 MySQL 数据库,并使用 Pandas 库读取数据库中的数据,最后使用 os 库打印出当前工作目录。import streamlit as st和import pandas as pd:的意思是导入streamlit和pandas库并缩写为st和pd,以便于引用的时候简写。
使用 Streamlit 组件
Streamlit 提供了很多常用的组件和功能,可以帮助你快速构建交互式应用程序。以下是一些常用的组件:
st.title():用于设置应用程序的标题。
st.write():用于输出文本、图像和其他数据。
st.markdown():用于输出 Markdown 格式的文本。
st.dataframe():用于输出 Pandas 数据框。
st.plotly_chart():用于输出 Plotly 图表。
st.map():用于输出地图。
这只是 Streamlit 组件的一部分,你还可以通过查看 Streamlit 官方文档了解更多组件和功能。
设置Streamlit页面布局
st.set_page_config()方法可以接受多个参数来定制页面的布局,以下是一些常用的参数:
page_title:设置页面的标题。
page_icon:设置页面的图标。
layout:设置页面的布局,可选值为centered、wide和dashboard。
initial_sidebar_state:设置侧边栏的初始状态,可选值为auto、expanded和collapsed。
menu_items:设置菜单栏中的项目。
menu_location:设置菜单栏的位置,可选值为left和top。
suppress_callback_exceptions:设置是否禁用回调异常捕获。
您可以根据需要使用这些参数来调整页面的布局效果。具体使用方法可以参考Streamlit的官方文档。
下面是一个app.py设置页面布局的例子
import streamlit as st import pandas as pd # 设置页面的布局 st.set_page_config(page_title="Streamlit App", page_icon=":smiley:", layout="wide") # 其他代码 ...
创建一个实现增删查改操作mysql的streamlit页面
vim aaa.py
import streamlit as st import pymysql import pandas as pd # 连接 MySQL 数据库 conn = pymysql.connect( host="localhost", user="root", password="password", database="student" ) # 创建游标对象 cur = conn.cursor() # Streamlit 应用程序 def main(): # 设置应用程序标题 st.title("MySQL 操作") # 添加数据 st.header("添加数据") name = st.text_input("姓名") age = st.number_input("年龄") if st.button("提交"): cur.execute("INSERT INTO users (name, age) VALUES (%s, %s)", (name, age)) conn.commit() st.success("数据添加成功!") # 查找数据 st.header("查找数据") result = cur.execute("SELECT * FROM users") data = cur.fetchall() if result: st.write("查询结果:") df = pd.DataFrame(list(data), columns=["id", "name", "age"]) st.dataframe(df) else: st.warning("没有查询到数据!") # 更新数据 st.header("更新数据") id = st.number_input("ID") name = st.text_input("姓名") age = st.number_input("年龄") if st.button("提交"): cur.execute("UPDATE users SET name=%s, age=%s WHERE id=%s", (name, age, id)) conn.commit() st.success("数据更新成功!") # 删除数据 st.header("删除数据") id = st.number_input("ID") if st.button("提交"): cur.execute("DELETE FROM users WHERE id=%s", (id,)) conn.commit() st.success("数据删除成功!") # 运行应用程序 if __name__ == "__main__": main()
此时运行这个python代码会出现如下效果
streamlit run aaa.py --server.port 80
如果你数据库的表创建好了的话插入功能是可以正常运行的,后面的可能会报错
下面这个是真正实现了增删查改的功能的,python代码如下
cat mysql.py
import streamlit as st import pymysql.cursors import pandas as pd # 创建 MySQL 数据库连接 def create_connection(): conn = None try: conn = pymysql.connect( host='localhost', user='root', password='password', database='student', cursorclass=pymysql.cursors.DictCursor ) st.sidebar.success('连接 MySQL 数据库成功') return conn except pymysql.Error as e: st.sidebar.error(f'连接 MySQL 数据库失败: {e}') # 获取 MySQL 数据库中的数据 def get_data(conn, table_name): try: with conn.cursor() as cursor: sql = f'SELECT * FROM {table_name}' cursor.execute(sql) rows = cursor.fetchall() return rows except pymysql.Error as e: st.error(f'从 {table_name} 表中获取数据失败: {e}') # 向 MySQL 数据库中插入数据 def insert_data(conn, table_name, data): try: with conn.cursor() as cursor: placeholders = ', '.join(['%s'] * len(data)) columns = ', '.join(data.keys()) sql = f'INSERT INTO {table_name} ({columns}) VALUES ({placeholders})' cursor.execute(sql, list(data.values())) conn.commit() st.success(f'成功将 {data} 插入到 {table_name} 表中') except pymysql.Error as e: st.error(f'向 {table_name} 表中插入数据失败: {e}') # 更新 MySQL 数据库中的数据 def update_data(conn, table_name, id, data): try: with conn.cursor() as cursor: columns = ', '.join([f"{key} = %s" for key in data.keys()]) sql = f'UPDATE {table_name} SET {columns} WHERE id = %s' values = list(data.values()) + [id] cursor.execute(sql, values) conn.commit() st.success(f'成功更新 {table_name} 表中的 {id} 数据') except pymysql.Error as e: st.error(f'更新 {table_name} 表中的数据失败: {e}') # 从 MySQL 数据库中删除数据 def delete_data(conn, table_name, id): try: with conn.cursor() as cursor: sql = f'DELETE FROM {table_name} WHERE id = %s' cursor.execute(sql, (id,)) conn.commit() st.success(f'成功从 {table_name} 表中删除 {id} 数据') except pymysql.Error as e: st.error(f'从 {table_name} 表中删除数据失败: {e}') # 主函数 def main(): # 设置全局的网页标题,网页图标,整体窗口大小 # st.set_page_config(page_title='Streamlit CRUD 示例', page_icon=':pencil2:') st.set_page_config(page_title="Streamlit App", page_icon=":smiley:", layout="centered") # 为这个会话创建一个唯一的键前缀 key_prefix = st.session_state.get("key_prefix", "default_prefix") # 创建 MySQL 数据库连接 conn = create_connection() # 显示一个表单,用于向 MySQL 数据库中插入数据 with st.form(key=f'{key_prefix}-insert-form'): st.header('插入数据') col1, col2, col3, col4 = st.columns(4) name = col1.text_input('姓名') age = col2.number_input('年龄', min_value=0) gender = col3.text_input('性别') id = col4.text_input('序号') if st.form_submit_button('提交'): insert_data(conn, 'users', {'name': name, 'age': age, 'gender': gender, 'id': id}) # 显示一个表单,用于更新 MySQL 数据库中的数据 with st.form(key=f'{key_prefix}-update-form'): st.header('更新数据') col1, col2 = st.columns(2) id = col1.number_input('ID', min_value=0) name = col2.text_input('姓名') age = col2.number_input('年龄', min_value=0) if st.form_submit_button('提交'): update_data(conn, 'users', id, {'name': name, 'age': age}) # 显示一个表单,用于从 MySQL 数据库中删除数据 with st.form(key=f'{key_prefix}-delete-form'): st.header('删除数据') id = st.number_input('ID', min_value=0) if st.form_submit_button('提交'): delete_data(conn, 'users', id) # 显示 MySQL 数据库中的数据 rows = get_data(conn, 'users') # if rows: # st.header('数据') # table_data = [[row['id'], row['name'], row['gender'], row['age'] ] for row in rows] # st.table(table_data) # 如果有数据,则显示表格 if rows: st.header('数据') # 将数据转换为DataFrame对象 df = pd.DataFrame(rows, columns=['id', 'name', 'gender', 'age']) # 显示表格的列名和数据 # st.write(df) # 显示表格,并设置宽度和高度 st.dataframe(df, width=1000, height=800) else: st.warning('没有找到数据') if __name__ == '__main__': main()
此时如果mysql表里的数据已经成功创建,运行应有如下效果
streamlit run mysql.py --server.port 80
MySQL数据库操作
登录
mysql -u root -p
创建数据库
create database xxx;
删除数据库(删除需谨慎,无法撤销删除)
drop database xxx;
查询
show databases; use student; select database(); show tables; describe tablename; select * from tablename; select name from tablename; select name and id from users;
创建表users,列name、age
CREATE TABLE users ( name VARCHAR(255), age INT); show tables; describe users;
修改表内容
在users表后面新增一个id名,数据类型VARCHAR,长度50,不能为空,在age后面增加
ALTER TABLE users ADD `id` VARCHAR(50) NOT NULL AFTER `age`;
如果按下去没反应也没报错,那是因为streamlit在使用这个数据库表,Ctrl+C停止streamlit就好了。
在age(年龄)后面新增gender(性别),数据类型VARCHAR长度50不允许为空在id后面
ALTER TABLE users ADD `gender` VARCHAR(50) NOT NULL AFTER `id`;
describe users;
更改id可以为NULL(空),并且数据类型是INT(整数)型
ALTER TABLE users MODIFY COLUMN id INT NULL;
把gender(性别)也修改可以为NULL(空),缩短数据类型为20个字符
ALTER TABLE users MODIFY COLUMN gender varchar(20) NULL;
把id修改为UNIQUE(唯一),不允许重复
ALTER TABLE users MODIFY COLUMN id INT NULL UNIQUE;
把id修改为NOT NULL(不允许为空),如果table里面面已经有数值就不允许修改,需要将id为NILL的数值删除掉才不会报错
ALTER TABLE users MODIFY COLUMN id INT NOT NULL UNIQUE;
删除表内容
删除一个name为孙悟空的值,如果有中文比如孙悟空这个名字,则必须把名字写在单引号内
delete from users where name='孙悟空';
删除一个age为445的值
delete from users where age=445;
用screen命令将streamlit转入后台运行
用screen命令可以方便的将streamlit转到后台运行,继续用vim编辑py程序,网页会实时更新代码效果的。
yum install screen -y
新建一个以aaa命名的后台任务
screen -S aaa
此时就进入了aaa任务下,界面和shell下面一样
streamlit run hhh.py --server.port 80
按Ctrl+A
再按D退出,返回正常界面
查看后台任务
screen -ls
[root@localhost streamlit项目]# screen -ls There are screens on: 6990.aaa(Detached) 6763.aaa(Detached) 2 Sockets in /run/screen/S-root.
此时看到后台有两个aaa的任务在运行
退出aaa任务,因为有两个aaa的名字,所以必须写完整的名称,如果只有一个aaa名字的不用写数字在前面
screen -X -S 6990.aaa quit
重连到aaa任务
screen -r aaa
此时就可以看到正在运行的streamlit,可以按Ctrl+C关闭任务,再运行别的streamlit,如何判断你是在sreen里面还是在正常的shell里面,history查看历史记录,在screen里面是没有screen -r aaa这条历史命令的
按Ctrl+A
按D退出,返回
发表评论