CentOS7.9安装Streamlit并且通过Web方式管理MySQL数据库(四)

环境

[root@localhost software]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

注意事项:必须先安装openssl再安装python,编译python指定openssl的目录是安装完成的目录不是解压目录

1、安装openssl

[root@localhost]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

yum install gcc openssl-devel bzip2-devel libffi-devel xz-devel perl -y
wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz
mkdir /software
cd /software/
cp /root/openssl-1.1.1u.tar.gz ./
cp *.gz /software/
tar -xvf openssl-1.1.1u.tar.gz 
cd openssl-1.1.1u

编译

指定安装目录/software/openssl和/software/openssl-111,make -j4意思是采用4核心CPU同时编译加快速度

./config --prefix=/software/openssl --openssldir=/software/openssl-111
make -j4
make install
mv /usr/bin/openssl /usr/bin/openssl-back
ln -s /software/openssl/bin/openssl /usr/bin/openssl
ln -s /software/openssl/include/openssl /usr/include/openssl

动态lib库

sh -c "echo '/software/openssl/lib'  >> /etc/ld.so.conf"
ldconfig -v
mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
ln -s openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so

查看版本,发现已经是1.1.1u新版本了

[root@localhost software]# openssl version
OpenSSL 1.1.1u  30 May 2023

但是python import ssl的版本还是老版本1.0.2k,先不管它了

[root@localhost software]# python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2k-fips  26 Jan 2017

2、安装Python

wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
tar -xvf Python-3.10.12.tgz
cd Python-3.10.12/
./configure --prefix=/software/python3.10 --with-openssl=/software/openssl
make -j4
make install
ln -s /software/python3.10/bin/python3.10 /usr/local/bin/python3
python3 --version
mv /usr/local/bin/pip3 /usr/local/bin/pip3.old
ln -s /software/python3.10/bin/pip3.10 /usr/local/bin/pip3
pip3 --version
ln -s /software/python3.10/bin/python3.10-config /usr/local/bin/python3-config

查看python import ssl的版本,新安装的python3已经是新版本了,老的python2不管了

[root@localhost software]# python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@localhost software]# python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.1.1u  30 May 2023

3、数据库配置

安装数据库及设置密码

yum groupinstall mariadb -y
systemctl enable mariadb --now
mysql_secure_installation
mysql -u root -p

创建student数据库和users表

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
MariaDB [(none)]> create database student;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use student;
Database changed
MariaDB [student]> CREATE TABLE users ( name VARCHAR(5), age INT, id INT NOT NULL UNIQUE, gender VARCHAR(5));
Query OK, 0 rows affected (0.00 sec)
MariaDB [student]> describe users;
+--------+------------+------+-----+---------+-------+
| Field  | Type       | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| name   | varchar(5) | YES  |     | NULL    |       |
| age    | int(11)    | YES  |     | NULL    |       |
| id     | int(11)    | NO   | PRI | NULL    |       |
| gender | varchar(5) | YES  |     | NULL    |       |
+--------+------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

数据库中文乱码解决

MariaDB [student]> ALTER DATABASE student CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)


4、安装streamlit

pip3 install streamlit
pip3 install pymysql
streamlit hello --server.port 80
systemctl stop firewalld
vim 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='root123',
            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()


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

发表评论