RockyLinux9.2下streamlit开发(三)


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

MYSQL1.jpg

如果你数据库的表创建好了的话插入功能是可以正常运行的,后面的可能会报错

下面这个是真正实现了增删查改的功能的,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

mysql2.jpg


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退出,返回



最后编辑于:2023/07/12作者: admin

发表评论