今天天气还是非常的不易出门,在家很闲,找点乐子,开发一个web在线数据库管理系统玩一玩。1.0版本暂时已完成,耗时3个小时,代码行数现100行左右,使用纯Python开发!
- 功能点规划:
- 支持常用db数据源:如MySQL、Oracle、postgres、Redis、mongodb、Hive、Hbase……
- 支持常用文件数据源:csv、parquet、excel……
- 支持表数据查询方式:SQL查询……
- 支持数据表展示方式:table表格、excel文件……
- UI 设计:
- 开发进度
- web页面布局已完成!
- MySQL数据已成功对接!
- 成果展示:视频发不了,只能以图片展示了!
- 代码展示与说明
- 导入相关Python库
import streamlit as st import pymysql import pandas as pd import os
- 编写页面开发MySQL数据接入并展示功能
代码量很少,100行左右,不分所谓的前后端,使得交互没有阻碍!
col_a, col_b, col_c = st.columns([1, 3, 1])
with col_b:
st.header('超级数据库管理系统 v1.0')
# 抽取全局参数
all_table = pd.Series(['default_table'])
table = 'default'
conn = ''
btn_flag = True
print('===============')
# 页面布局第一行两列
col1, col_block1, col2 = st.columns([1, 1, 3])
with col1:
st.info('连接信息')
with col2:
st.error('SQL查询窗口(暂未开发,等一等!)')
st.header('')
# 页面布局第二行四列
col20, col_block, col21, col22, col23 = st.columns([2, 1, 2, 1, 2])
with col20:
db_type = st.selectbox(
'数据库类型',
['MySQL', 'Postgres', 'Hive']
)
with st.expander('数据库参数'):
host_name = st.text_input('Host', value='localhost')
port = st.text_input('Port', value=3306)
user_name = st.text_input('User', value='root')
user_pass = st.text_input('Password', value='root')
db_name = st.text_input('db', value='test')
btn_flag = st.button('点击连接')
if btn_flag:
st.balloons()
print('========数据库连接部分========')
conn = pymysql.connect(
host=host_name,
user=user_name,
password=user_pass,
port=int(port),
db=db_name,
charset='utf8'
)
db_info = [host_name, port, user_name, user_pass, db_name]
db_info_series = pd.Series(db_info)
db_info_series.to_csv('db_info_series.csv')
print(f'save db_info to csv success!')
tables_sql = 'show tables'
tables = pd.read_sql(tables_sql, conn)
all_table = tables[tables.columns.values[0]]
table = all_table[0]
all_table.to_csv('all_table.csv')
print(f'save all_table to csv success!')
with col21:
st.success(f'表列表显示')
print(f'======表下拉框部分========')
if os.path.exists('all_table.csv'):
c_tables = pd.read_csv('all_table.csv')
all_table = c_tables[c_tables.columns.values[1]]
table = all_table[0]
if table in all_table.values:
table = st.selectbox(
'',
all_table
)
with st.expander(f'查看{table}元数据'):
print(f'======元数据部分======')
print(f'current_table:{table}')
print(f'all_table:{all_table.values}')
print(f'conn:{conn}')
if os.path.exists('db_info_series.csv'):
c_db_info = pd.read_csv('db_info_series.csv').values
conn = pymysql.connect(
host=c_db_info[0][1],
user=c_db_info[2][1],
password=c_db_info[3][1],
port=int(c_db_info[1][1]),
db=c_db_info[4][1],
charset='utf8'
)
print(f'conn:{conn}')
if table in all_table.values:
schema_sql = f'desc {table}'
schema_df = pd.read_sql(schema_sql, conn)
st.table(schema_df[['Field', 'Type']])
with col23:
st.success(f'{table}数据')
print(f'======数据展示部分======')
print(f'current_table:{table}')
print(f'all_table:{all_table.values}')
if table in all_table.values:
query_sql = f'select * from {table}'
query_df = pd.read_sql(query_sql, conn)
st.table(query_df)
- 后续补充
- 完善页面,增加美观度
- 完善功能:
- 增加其他常用数据库的对接,比如:postgress、Hive、hbase、redis、MongoDB……
- 增加文本文件数据的对接,比如:csv,parquet,excel……
- 增加在线SQL查询
- 增加数据展示的方式,比如:直方图、折线图……
- 优化性能
- ……
整体没有难度,拿着当Python课设应该问题不大,嘿嘿!



