当前位置: 首页 > news >正文

基于shell脚本实现mysql导出指定/全量表前n条,快速预览数据结构

在这里插入图片描述
场景:需要快速预览多个表数据时候

#!/bin/bash
# MySQL数据导出到TXT文件(字段名带注释)
CONFIG_FILE="1.txt"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="root"
LIMIT=3
OUTPUT_FILE="export_$(date +%Y%m%d_%H%M%S).txt"# 初始化输出文件
echo "MySQL数据导出 - $(date '+%Y-%m-%d %H:%M:%S')" > "$OUTPUT_FILE"
success=0# 导出表数据(字段名带注释)的函数
export_table_with_comments() {local db=$1local table=$2echo "" >> "$OUTPUT_FILE"echo "============ $db.$table ============" >> "$OUTPUT_FILE"# 构建带注释的SELECT语句local select_sql=$(mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \-e "SELECT GROUP_CONCAT(CASE WHEN COLUMN_COMMENT != '' THEN CONCAT(COLUMN_NAME, ' AS \`', COLUMN_NAME, '(', COLUMN_COMMENT, ')\`')ELSE COLUMN_NAMEENDSEPARATOR ', ') AS select_clauseFROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$db' AND TABLE_NAME='$table'ORDER BY ORDINAL_POSITION;" 2>/dev/null | tail -n1)if [[ -n "$select_sql" ]]; then# 执行带注释字段名的查询if mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \--table -e "SELECT $select_sql FROM $db.$table LIMIT $LIMIT;" 2>/dev/null >> "$OUTPUT_FILE"; then((success++))echo "✓ 成功导出: $db.$table"elseecho "✗ 导出失败: $db.$table"fielseecho "✗ 无法获取表结构: $db.$table"fi
}if [[ -f "$CONFIG_FILE" ]]; thenecho "使用配置文件 $CONFIG_FILE"# 处理配置文件中的表while IFS=',' read -r db table; do[[ -z "$db" || "$db" =~ ^# ]] && continuedb=$(echo "$db" | xargs)table=$(echo "$table" | xargs)export_table_with_comments "$db" "$table"done < "$CONFIG_FILE"
elseecho "配置文件不存在,导出所有数据库的表(快速预览)"# 获取所有数据库(排除系统库)databases=$(mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \-e "SHOW DATABASES;" 2>/dev/null | grep -v -E "^(Database|information_schema|mysql|performance_schema|sys)$")for db in $databases; do[[ -z "$db" ]] && continueecho "正在处理数据库: $db"# 获取该数据库的所有表tables=$(mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \-e "USE $db; SHOW TABLES;" 2>/dev/null | grep -v "^Tables_in")for table in $tables; do[[ -z "$table" ]] && continueexport_table_with_comments "$db" "$table"donedone
fiecho "成功导出 $success 个表到 $OUTPUT_FILE"

flask版本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MySQL数据预览工具 - 极简版
"""from flask import Flask, render_template_string, request, jsonify
import pymysqlapp = Flask(__name__)# MySQL配置
MYSQL_CONFIG = {'host': '127.0.0.1','port': 3306,'user': 'root','password': 'root','charset': 'utf8mb4','autocommit': True
}def get_db_connection():"""获取数据库连接"""try:connection = pymysql.connect(**MYSQL_CONFIG)return connectionexcept Exception as e:print(f"数据库连接失败: {e}")return Nonedef get_all_tables():"""获取所有数据库和表"""try:conn = get_db_connection()if not conn:return {}cursor = conn.cursor()# 获取所有数据库cursor.execute("SHOW DATABASES")databases = cursor.fetchall()system_dbs = ['information_schema', 'mysql', 'performance_schema', 'sys']db_list = [db[0] for db in databases if db[0] not in system_dbs]all_tables = {}for db in db_list:try:cursor.execute(f"USE `{db}`")cursor.execute("SHOW TABLES")tables = cursor.fetchall()all_tables[db] = [table[0] for table in tables]except Exception as e:print(f"获取数据库 {db} 的表失败: {e}")all_tables[db] = []cursor.close()conn.close()return all_tablesexcept Exception as e:print(f"获取数据库列表失败: {e}")return {}def get_table_data(database, table, limit=2):"""获取表数据"""try:conn = get_db_connection()if not conn:return [], []cursor = conn.cursor()# 获取列信息sql = """SELECT COLUMN_NAME, COLUMN_COMMENTFROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=%s AND TABLE_NAME=%sORDER BY ORDINAL_POSITION"""cursor.execute(sql, (database, table))columns = cursor.fetchall()if not columns:return [], []# 构建字段名(包含注释)headers = []select_fields = []for col in columns:col_name = col[0]col_comment = col[1]if col_comment:header = f"{col_name}({col_comment})"else:header = col_nameheaders.append(header)select_fields.append(f"`{col_name}`")# 查询数据sql = f"SELECT {', '.join(select_fields)} FROM `{database}`.`{table}` LIMIT {limit}"cursor.execute(sql)data = cursor.fetchall()# 处理NULL值processed_data = []for row in data:processed_row = []for cell in row:if cell is None:processed_row.append(None)  # 保持None,在前端处理else:processed_row.append(str(cell))processed_data.append(processed_row)cursor.close()conn.close()return headers, processed_dataexcept Exception as e:print(f"获取表数据失败: {e}")return [], []@app.route('/')
def index():"""主页面"""all_tables = get_all_tables()html_template = """
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>MySQL数据预览</title><style>* { margin: 0; padding: 0; box-sizing: border-box; }body {font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;background: #f8f9fa;line-height: 1.4;font-size: 13px;zoom: 0.9;}.header {background: #fff;padding: 15px;border-bottom: 1px solid #e0e0e0;text-align: center;}.header h1 {color: #333;font-size: 20px;font-weight: 500;}.controls {background: #fff;padding: 15px;border-bottom: 1px solid #e0e0e0;}.db-section {margin-bottom: 12px;}.db-title {font-weight: 500;color: #2c3e50;margin-bottom: 6px;cursor: pointer;padding: 6px 8px;background: #f8f9fa;border-radius: 3px;font-size: 13px;display: flex;align-items: center;justify-content: space-between;}.db-title:hover {background: #e9ecef;}.db-left {display: flex;align-items: center;}.db-actions {font-size: 11px;color: #007bff;cursor: pointer;padding: 2px 6px;border-radius: 2px;}.db-actions:hover {background: rgba(0,123,255,0.1);}.table-list {margin-left: 16px;display: flex;flex-wrap: wrap;gap: 6px;}.table-item {display: flex;align-items: center;margin-bottom: 3px;}.table-item input[type="checkbox"] {margin-right: 4px;transform: scale(0.85);}.table-item label {cursor: pointer;padding: 2px 5px;border-radius: 2px;transition: background 0.2s;font-size: 11px;color: #555;}.table-item label:hover {background: #f0f0f0;}.action-bar {margin-top: 12px;display: flex;gap: 8px;align-items: center;}.btn {padding: 6px 12px;border: 1px solid #ddd;background: #fff;border-radius: 3px;cursor: pointer;font-size: 12px;}.btn-primary {background: #007bff;color: white;border-color: #007bff;}.btn:hover {background: #f8f9fa;}.btn-primary:hover {background: #0056b3;}.limit-input {width: 50px;padding: 6px;border: 1px solid #ddd;border-radius: 3px;text-align: center;font-size: 12px;}.results {padding: 15px;}.table-result {background: #fff;margin-bottom: 15px;border-radius: 4px;overflow: hidden;box-shadow: 0 1px 2px rgba(0,0,0,0.08);}.table-header {background: #f8f9fa;padding: 10px 12px;border-bottom: 1px solid #e0e0e0;}.table-header h3 {color: #333;font-size: 14px;font-weight: 600;}.table-container {overflow-x: auto;}table {width: 100%;border-collapse: collapse;font-size: 12px;}th {background: #f1f3f4;padding: 8px 10px;text-align: left;font-weight: 500;color: #333;border-bottom: 1px solid #e0e0e0;white-space: nowrap;font-size: 11px;}td {padding: 6px 10px;border-bottom: 1px solid #f0f0f0;white-space: nowrap;max-width: 180px;overflow: hidden;text-overflow: ellipsis;font-size: 11px;}.null-value {color: #6c757d;font-style: italic;background: #f8f9fa;padding: 1px 4px;border-radius: 2px;font-size: 10px;}.empty-value {color: #dc3545;font-style: italic;font-size: 10px;}tr:nth-child(even) {background: #fafafa;}tr:hover {background: #f0f8ff;}.no-data {padding: 30px;text-align: center;color: #666;font-size: 12px;}.loading {padding: 15px;text-align: center;color: #666;font-size: 12px;}.collapsed {display: none;}.expand-icon {margin-right: 4px;font-size: 10px;display: inline-block;transition: transform 0.2s;}.collapsed-icon {transform: rotate(-90deg);}</style>
</head>
<body><div class="header"><h1>MySQL数据预览</h1></div><div class="controls"><!-- 数据库和表列表 --><div id="db-list">{% for db, tables in all_tables.items() %}<div class="db-section"><div class="db-title"><div class="db-left" onclick="toggleDb('{{ db }}')"><span class="expand-icon" id="icon-{{ db }}"></span>{{ db }} ({{ tables|length }})</div><span class="db-actions" onclick="selectDb('{{ db }}')">选择全部</span></div><div class="table-list" id="tables-{{ db }}">{% for table in tables %}<div class="table-item"><input type="checkbox" id="{{ db }}.{{ table }}" value="{{ db }}.{{ table }}"><label for="{{ db }}.{{ table }}">{{ table }}</label></div>{% endfor %}</div></div>{% endfor %}</div><div class="action-bar"><button class="btn" onclick="selectAll()">全选</button><button class="btn" onclick="selectNone()">清空</button><span>条数:</span><input type="number" class="limit-input" id="limit" value="2" min="1" max="50"><button class="btn btn-primary" onclick="loadSelectedData()">查看数据</button></div></div><div class="results" id="results"><div class="no-data">请选择要查看的表</div></div><script>// 切换数据库展开/折叠function toggleDb(db) {const tables = document.getElementById('tables-' + db);const icon = document.getElementById('icon-' + db);if (tables.classList.contains('collapsed')) {tables.classList.remove('collapsed');icon.textContent = '▼';icon.classList.remove('collapsed-icon');} else {tables.classList.add('collapsed');icon.textContent = '▶';icon.classList.add('collapsed-icon');}}// 选择整个数据库的所有表function selectDb(db) {const checkboxes = document.querySelectorAll(`input[value^="${db}."]`);const allChecked = Array.from(checkboxes).every(cb => cb.checked);// 如果全部选中则取消选中,否则全部选中checkboxes.forEach(cb => cb.checked = !allChecked);}// 全选function selectAll() {const checkboxes = document.querySelectorAll('input[type="checkbox"]');checkboxes.forEach(cb => cb.checked = true);}// 清空选择function selectNone() {const checkboxes = document.querySelectorAll('input[type="checkbox"]');checkboxes.forEach(cb => cb.checked = false);}// 加载选中的表数据function loadSelectedData() {const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked');const limit = document.getElementById('limit').value;if (checkboxes.length === 0) {alert('请选择要查看的表');return;}const selected = Array.from(checkboxes).map(cb => cb.value);document.getElementById('results').innerHTML = '<div class="loading">正在加载...</div>';fetch('/api/batch_data', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({tables: selected,limit: parseInt(limit)})}).then(response => response.json()).then(data => {displayResults(data);}).catch(error => {console.error('加载失败:', error);document.getElementById('results').innerHTML = '<div class="no-data">加载失败</div>';});}// 格式化单元格内容function formatCellValue(value) {if (value === null || value === undefined) {return '<span class="null-value">NULL</span>';}const strValue = String(value).trim();if (strValue === '') {return '<span class="empty-value">空字符串</span>';}// 处理特殊的NULL字符串显示if (strValue.includes('NULL">') || strValue.includes('*NULL*')) {return '<span class="null-value">NULL</span>';}return strValue;}// 显示结果function displayResults(results) {let html = '';if (results.length === 0) {html = '<div class="no-data">没有数据</div>';} else {results.forEach(result => {html += `<div class="table-result"><div class="table-header"><h3>${result.database}.${result.table}</h3></div><div class="table-container">`;if (result.success && result.data.length > 0) {html += `<table><thead><tr>`;result.headers.forEach(header => {html += `<th>${header}</th>`;});html += `</tr></thead><tbody>`;result.data.forEach(row => {html += '<tr>';row.forEach(cell => {const cellValue = formatCellValue(cell);html += `<td>${cellValue}</td>`;});html += '</tr>';});html += `</tbody></table>`;} else {html += `<div style="padding: 15px; color: #666; font-size: 12px;">${result.error || '暂无数据'}</div>`;}html += `</div></div>`;});}document.getElementById('results').innerHTML = html;}// 页面加载完成后默认加载前几个表的数据document.addEventListener('DOMContentLoaded', function() {// 默认选中前3个表并加载数据const checkboxes = document.querySelectorAll('input[type="checkbox"]');for (let i = 0; i < Math.min(3, checkboxes.length); i++) {checkboxes[i].checked = true;}// 延迟一点自动加载数据setTimeout(() => {if (document.querySelectorAll('input[type="checkbox"]:checked').length > 0) {loadSelectedData();}}, 500);});</script>
</body>
</html>"""return render_template_string(html_template, all_tables=all_tables)@app.route('/api/batch_data', methods=['POST'])
def api_batch_data():"""API: 批量获取多个表的数据"""try:data = request.get_json()tables = data.get('tables', [])limit = data.get('limit', 2)results = []for table_name in tables:try:database, table = table_name.split('.', 1)headers, table_data = get_table_data(database, table, limit)results.append({'database': database,'table': table,'success': True,'headers': headers,'data': table_data,'count': len(table_data)})except Exception as e:results.append({'database': database if 'database' in locals() else 'unknown','table': table if 'table' in locals() else table_name,'success': False,'error': str(e),'headers': [],'data': []})return jsonify(results)except Exception as e:return jsonify({'error': str(e)}), 500if __name__ == '__main__':# 测试数据库连接conn = get_db_connection()if conn:print("✅ 数据库连接测试成功!")conn.close()else:print("❌ 数据库连接测试失败,请检查配置!")app.run(debug=True, host='0.0.0.0', port=5000)

在这里插入图片描述


文章转载自:

http://oSuYegLl.dygqq.cn
http://evj8t4bH.dygqq.cn
http://mnCBqVsd.dygqq.cn
http://TUQ8ct0t.dygqq.cn
http://CVuDjfPJ.dygqq.cn
http://t8oinI63.dygqq.cn
http://WUNKpRAx.dygqq.cn
http://95rAjKz4.dygqq.cn
http://lGSw7cVc.dygqq.cn
http://rfFdjeOM.dygqq.cn
http://WLuq3zrg.dygqq.cn
http://voizGRLH.dygqq.cn
http://WkJBzYs2.dygqq.cn
http://l6DXLnxF.dygqq.cn
http://z0WFJq9W.dygqq.cn
http://jHCvdDBt.dygqq.cn
http://s2ekIaB5.dygqq.cn
http://7cNZBEiv.dygqq.cn
http://USzeWFOJ.dygqq.cn
http://V3NHq5so.dygqq.cn
http://5ZKTZOv2.dygqq.cn
http://gutukpVZ.dygqq.cn
http://zq0MVyJH.dygqq.cn
http://id8XMghP.dygqq.cn
http://BKEj677r.dygqq.cn
http://woEzvp7T.dygqq.cn
http://vYlbtzjl.dygqq.cn
http://68cZDttV.dygqq.cn
http://imeYGWB6.dygqq.cn
http://GvnGdo6B.dygqq.cn
http://www.dtcms.com/a/384992.html

相关文章:

  • 【spring MVC】的执行流程
  • NLP Subword 之 BPE(Byte Pair Encoding) 算法原理
  • 从 Web 到 LLM,多入口、多链路的自动化威胁如何防护?
  • Roo Code代码库索引功能
  • 以太网链路聚合实验
  • 机理流程图绘制,如此简单 !
  • 从按钮到接口:权限系统设计的艺术与实践 —— 打造细粒度可扩展的权限架构
  • 3D 打印在道具制作领域的应用调研与轻资产介入策略创意报告
  • Python多进程通信完全指南:打破进程隔离的壁垒
  • webrtc之语音活动下——VAD人声判定原理以及源码详解
  • S32K3平台RTC应用笔记
  • 开源收银系统_大型收银系统源码_OctShop
  • UE5 蓝图接口函数类型知多少?
  • 【MySQL分库分表:海量数据架构的终极解决方案】
  • 深入解析 Apache RocketMQ架构组成与核心组件作用
  • Tomcat下载和安装教程(图文并茂,适合新手)
  • (用Maven)整合SpringBoot,SpringMVC,MyBatis
  • 数据结构---基于链式存储结构实现的双端队列
  • 【完整源码+数据集+部署教程】训练自动化:电杆基坑分割系统 yolov8-seg-C2f-CloAtt
  • 某发电替代扩建项目集控楼高大支模自动化监测
  • 什么是产品思维?产品经理如何提高产品思维?
  • Quat.js四元数完全指南
  • 34.Socket编程(UDP)(上)
  • 综合篇| 智能体平台dify、coze和n8n对比
  • Crond服务
  • LazyVim设置tab
  • 【无标题】好吧
  • 【Git】零基础入门:配置与初始操作实战指南
  • 云手机兼容性对游戏的重要性
  • Vue-color:Vue.js 专业颜色选择器组件库 – 支持Vue2/3,TypeScript,暗色主题