{"id":"62dc79ec-a4b1-4ae3-8d9b-3899625b029f","entityType":"agent","slug":"clawhub-moniq888-sql-database-toolkit","name":"SQL Database Toolkit","canonicalUrl":"https://www.xpersona.co/agent/clawhub-moniq888-sql-database-toolkit","canonicalPath":"/agent/clawhub-moniq888-sql-database-toolkit","generatedAt":"2026-10-11T03:53:16.726Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":null},"description":"All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates. Skill: SQL Database Toolkit Owner: moniq888 Summary: All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates. Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-04T01:51:27.323Z | user SQL Database Toolkit 1.0.0 - 首次统一发布：整合 sql-master、sql-dataviz、sql-report-generator 三大功能包 - 支持多种数据库（如 SQLite、MySQL、PostgreSQL 等）及本","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1774kyr593ezfy7qtq3g4k9t983g3a1:sql-database-toolkit","sourceUrl":"https://clawhub.ai/moniq888/sql-database-toolkit","homepage":"https://clawhub.ai/moniq888/skills/sql-database-toolkit","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/moniq888/sql-database-toolkit","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/moniq888/skills/sql-database-toolkit","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":40,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":null},"stars":null,"forks":null,"downloads":1211,"packageName":null,"latestVersion":"1.0.0","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T01:05:03.856Z","lastCrawledAt":"2026-10-11T01:05:03.856Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T01:05:03.856Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.0","createdAt":"2026-04-04T01:51:27.323Z","changelog":"SQL Database Toolkit 1.0.0 - 首次统一发布：整合 sql-master、sql-dataviz、sql-report-generator 三大功能包 - 支持多种数据库（如 SQLite、MySQL、PostgreSQL 等）及本地数据文件（CSV/Excel/JSON/Parquet）接入 - 提供自然语言转 SQL、SQL 执行与优化、富查询结果分析 - 内置 24+ 种静态图表和 12 种交互式图表，可选多种主题（如 Power BI 风格） - 一键生成完整 HTML 报告、KPI 仪表盘，内置 90+ 行业模板 - 支持 AI 洞察：自动异常检测、趋势分析、相关性分析、TOP N 排名等 - 提供端到端统一 Pipeline，支持从数据到洞察、报告的完整流程","fileCount":81,"zipByteSize":265232}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1774kyr593ezfy7qtq3g4k9t983g3a1:sql-database-toolkit","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T03:53:16.725Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-moniq888-sql-database-toolkit/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":null},"readme":"Skill: SQL Database Toolkit\n\nOwner: moniq888\n\nSummary: All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates.\n\nTags: latest:1.0.0\n\nVersion history:\n\nv1.0.0 | 2026-04-04T01:51:27.323Z | user\n\nSQL Database Toolkit 1.0.0\n\n- 首次统一发布：整合 sql-master、sql-dataviz、sql-report-generator 三大功能包\n- 支持多种数据库（如 SQLite、MySQL、PostgreSQL 等）及本地数据文件（CSV/Excel/JSON/Parquet）接入\n- 提供自然语言转 SQL、SQL 执行与优化、富查询结果分析\n- 内置 24+ 种静态图表和 12 种交互式图表，可选多种主题（如 Power BI 风格）\n- 一键生成完整 HTML 报告、KPI 仪表盘，内置 90+ 行业模板\n- 支持 AI 洞察：自动异常检测、趋势分析、相关性分析、TOP N 排名等\n- 提供端到端统一 Pipeline，支持从数据到洞察、报告的完整流程\n\nArchive index:\n\nArchive v1.0.0: 81 files, 265232 bytes\n\nFiles: references/bar-charts.md (4265b), references/canvas-render.md (2849b), references/chart-guidelines.md (8230b), references/chart-planning.md (4983b), references/chart-selection.md (3259b), references/cli-quickref.md (6312b), references/dashboard.md (5213b), references/data-warehouse.md (8271b), references/ddl-design.md (7684b), references/dialect-guide.md (6934b), references/distribution.md (14610b), references/heatmap.md (21514b), references/hive-skew-advanced.md (19618b), references/index-design.md (5900b), references/insight-patterns.md (8276b), references/INSTALLATION.md (7674b), references/INTEGRATION_GUIDE.md (12125b), references/line-area.md (3989b), references/plotly-interactive.md (4962b), references/query-optimization.md (8157b), references/scatter.md (17802b), references/sql-generation.md (7250b), references/sql-internals.md (9668b), references/sql-security.md (3849b), references/templates-index.md (6901b), references/visualization-guide.md (7602b), requirements.txt (2147b), scripts/__init__.py (2423b), scripts/ai_insights.py (30740b), scripts/charts.py (74361b), scripts/dashboard_templates.py (159633b), scripts/dashboard_tooltips.py (19257b), scripts/database_connector.py (15639b), scripts/demo.py (14108b), scripts/file_connector.py (21770b), scripts/generate_report.py (13600b), scripts/generate_templates.py (6000b), scripts/install_deps.sh (2233b), scripts/interactive_charts.py (50631b), scripts/pipeline.py (23390b), scripts/report_generator.py (18843b), scripts/unified_pipeline.py (27375b), skill-card.md (2916b), SKILL.md (6976b), templates/ad_roi.md (3308b), templates/budget_execution.md (2134b), templates/category_analysis.md (3151b), templates/city_operations.md (4579b), templates/content_overview.md (6142b), templates/content_production.md (3540b), templates/creator_ecosystem.md (3963b), templates/dau_mau.md (4196b), templates/ecommerce_overview.md (5284b), templates/emergency_command.md (3385b), templates/energy_consumption.md (3131b), templates/enrollment_funnel.md (4451b), templates/game_monetization.md (3884b), templates/hospital_operations.md (5422b), templates/hr_structure.md (3249b), templates/insurance.md (4244b), templates/inventory.md (3266b), templates/ip_monetization.md (4415b), templates/learning_quality.md (3793b), templates/marketing_sales.md (4318b), templates/menu_analysis.md (3094b), templates/patient_satisfaction.md (3511b), templates/photovoltaic_monitor.md (4821b), templates/production_oee.md (3331b), templates/profit_overview.md (3981b), templates/recruitment.md (2483b), templates/restaurant_operations.md (5265b), templates/retail_aum.md (3745b), templates/risk_control.md (2962b), templates/sales_network.md (4535b), templates/service_quality.md (4643b), templates/store_performance.md (3486b), templates/supply_chain_control.md (5149b), templates/supply_chain.md (3184b), templates/user_growth.md (4324b), templates/user_lifecycle.md (4045b)\n\nFile v1.0.0:SKILL.md\n\n# SQL Database Toolkit\n\n_全链路 SQL 数据分析工具包：数据连接 → SQL 查询 → 数据可视化 → AI 洞察 → 报告生成_\n\n## 概述\n\nSQL Database Toolkit 是 sql-master、sql-dataviz、sql-report-generator 三大 Skill 的统一整合版本，提供端到端的 SQL 数据分析能力。\n\n**核心能力：**\n- **数据连接层**：支持 SQLite/MySQL/PostgreSQL/SQL Server/ClickHouse 等多种数据库，以及 CSV/Excel/JSON/Parquet 等本地文件格式\n- **SQL 查询执行**：自然语言转 SQL、SQL 执行与优化、查询结果分析\n- **数据可视化**：24+ 种静态图表（PNG base64）+ 12 种交互式图表（HTML），支持 Power BI 风格配色\n- **AI 洞察**：基于统计的自动异常检测、趋势分析、相关性分析、TOP N 排名等\n- **报告生成**：完整 HTML 报告、KPI 仪表盘、行业模板库（90+ 模板）\n\n## 触发条件\n\n当用户提及以下关键词时触发：\n- SQL 查询、执行、优化\n- 数据库连接（MySQL/PostgreSQL/SQLite 等）\n- 数据可视化、图表生成（折线图/柱状图/饼图/热力图等）\n- 报告生成、仪表盘、数据看板\n- 数据分析、洞察、异常检测\n- 文件数据处理（CSV/Excel 导入导出）\n\n## 安装依赖\n\n```bash\npip install -r requirements.txt\n```\n\n**核心依赖：**\n- pandas, numpy - 数据处理\n- sqlalchemy, pymysql, psycopg2-binary - 数据库连接\n- matplotlib, seaborn, plotly - 可视化\n- scipy - 统计分析\n- jinja2 - 模板引擎\n\n## 快速开始\n\n### 1. 一键端到端分析\n\n```python\nfrom unified_pipeline import analyze_file\n\n# 文件 → SQL → 图表 → 洞察 → 报告\nresult = analyze_file(\n    \"sales.csv\",\n    sql=\"SELECT region, SUM(sales) as total FROM data GROUP BY region\",\n    charts=[{\"type\":\"bar\",\"x\":\"region\",\"y\":\"total\",\"title\":\"区域销售\"}],\n    output=\"report.html\"\n)\nprint(result.log())\n```\n\n### 2. 数据库查询\n\n```python\nfrom database_connector import DatabaseConnector\n\n# 连接 MySQL\nconn = DatabaseConnector(\n    dialect=\"mysql+pymysql\",\n    host=\"localhost\", port=3306,\n    username=\"root\", password=\"xxx\",\n    database=\"sales_db\"\n)\nresult = conn.execute(\"SELECT * FROM orders WHERE amount > 1000\")\nprint(result.df)\n```\n\n### 3. 生成交互式图表\n\n```python\nfrom interactive_charts import InteractiveChartFactory\n\nfactory = InteractiveChartFactory(theme=\"powerbi\")\nhtml = factory.create_line({\n    \"categories\": [\"1月\",\"2月\",\"3月\"],\n    \"series\": [{\"name\":\"销售额\",\"data\":[100,120,150]}]\n})\nfactory.save_html(html, \"chart.html\")\n```\n\n### 4. AI 自动洞察\n\n```python\nfrom ai_insights import quick_insights\n\nreport = quick_insights(df, date_col=\"date\", value_cols=[\"sales\",\"profit\"])\nfor insight in report.insights:\n    print(f\"{insight.title}: {insight.description}\")\n```\n\n## 模块索引\n\n### 数据连接层\n\n| 模块 | 功能 |\n|------|------|\n| `database_connector.py` | 数据库连接（支持 6+ 种数据库） |\n| `file_connector.py` | 本地文件加载（CSV/Excel/JSON/Parquet 等） |\n| `pipeline.py` | SQL Pipeline 编排器 |\n\n### 可视化层\n\n| 模块 | 功能 |\n|------|------|\n| `charts.py` | 静态图表工厂（24+ 种图表，PNG base64） |\n| `interactive_charts.py` | 交互式图表工厂（12 种图表，HTML）+ DashboardBuilder |\n\n### 报告层\n\n| 模块 | 功能 |\n|------|------|\n| `ai_insights.py` | AI 自动洞察生成器 |\n| `dashboard_templates.py` | 行业看板模板库（90+ 模板） |\n| `report_generator.py` | 报告生成器（表格/矩阵/切片器） |\n\n### 统一入口\n\n| 模块 | 功能 |\n|------|------|\n| `unified_pipeline.py` | 端到端统一 Pipeline（推荐） |\n| `__init__.py` | 统一导出所有核心类 |\n\n## 使用示例\n\n### 示例 1：完整分析流程\n\n```python\nfrom unified_pipeline import UnifiedPipeline\n\n# 创建 Pipeline\np = UnifiedPipeline(\"销售分析\").set_theme(\"powerbi\")\n\n# 加载数据\np.from_file(\"sales.csv\")\n\n# SQL 查询\np.query(\"SELECT region, SUM(amount) as total FROM data GROUP BY region\")\n\n# 生成交互式图表\np.interactive_chart(\"bar\", x_col=\"region\", y_col=\"total\", title=\"区域销售\")\np.interactive_chart(\"pie\", x_col=\"region\", y_col=\"total\", title=\"区域占比\")\n\n# AI 洞察\np.insights(value_cols=[\"total\"])\n\n# 生成完整报告\np.report(title=\"销售分析报告\", output=\"report.html\")\n\n# 打印日志\nprint(p.log())\n```\n\n### 示例 2：数据库 → 可视化\n\n```python\nfrom database_connector import DatabaseConnector\nfrom interactive_charts import InteractiveChartFactory\n\n# 查询数据\nconn = DatabaseConnector(dialect=\"sqlite\", database=\"sales.db\")\ndf = conn.execute(\"SELECT month, sales FROM monthly_sales\").df\n\n# 生成图表\nfactory = InteractiveChartFactory()\nhtml = factory.create_line({\n    \"categories\": df[\"month\"].tolist(),\n    \"series\": [{\"name\": \"销售额\", \"data\": df[\"sales\"].tolist()}]\n}, title=\"月度销售趋势\")\nfactory.save_html(html, \"trend.html\")\n```\n\n### 示例 3：构建 Dashboard\n\n```python\nfrom interactive_charts import DashboardBuilder, InteractiveChartFactory\n\nbuilder = DashboardBuilder(title=\"销售看板\", theme=\"powerbi\")\n\n# KPI 卡片\nbuilder.add_kpi_cards([\n    {\"title\": \"GMV\", \"value\": \"¥1,234万\", \"change\": \"+18%\"},\n    {\"title\": \"订单量\", \"value\": \"45,678\", \"change\": \"+12%\"},\n])\n\n# 添加图表\nfactory = InteractiveChartFactory()\nline_html = factory.create_line({...})\nbuilder.add_chart(line_html, title=\"趋势\", cols=2)\n\n# 生成\nbuilder.build(\"dashboard.html\")\n```\n\n### 示例 4：使用行业模板\n\n```python\nfrom dashboard_templates import get_template\n\n# 获取电商概览模板\ntemplate = get_template(\"ecommerce_overview\")\n\n# 根据模板配置生成图表\n# template.charts 包含所有图表规格\n```\n\n## 配置与主题\n\n### 配色主题\n\n```python\nfrom charts import Theme\n\n# 支持的主题：POWERBI, ALIBABA, TENCENT, BYTEDANCE, NEUTRAL\nfactory = ChartFactory()\nfactory.set_theme(\"powerbi\")\n```\n\n### 图表类型\n\n**静态图表（charts.py）：**\n- 对比分析：clustered_column, stacked_column, bar, line, area, waterfall\n- 占比分析：pie, donut, treemap, funnel\n- 分布分析：scatter, bubble, box_plot, histogram\n- 指标监控：card, kpi, gauge, target\n- 高级图表：heatmap, gantt, candlestick, sankey, word_cloud\n\n**交互式图表（interactive_charts.py）：**\n- line, bar, pie, scatter, heatmap, funnel, area, treemap, gauge, combo, table, kpi_cards\n\n## 配置文件\n\n- `requirements.txt` - Python 依赖\n- `references/` - 参考文档（SQL 优化、图表选择、模板使用等）\n- `templates/` - 行业报告模板（90+ 个）\n\n## 注意事项\n\n1. **中文字体**：Windows 环境自动使用 Microsoft YaHei，其他系统需确保已安装中文字体\n2. **数据库驱动**：首次使用 MySQL/PostgreSQL 等需要安装对应驱动（pymysql/psycopg2）\n3. **Plotly CDN**：交互式图表默认使用 CDN，如需离线使用可替换为本地路径\n\n## 版本\n\nv2.0.0 - 合并版（基于 sql-master + sql-dataviz + sql-report-generator）\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn76k6338wpqydkxgdztg6vb9x83hz20\",\n  \"slug\": \"sql-database-toolkit\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1775267487323\n}\n\nFile v1.0.0:references/bar-charts.md\n\n# 条形图 & 横向条形图\n\n适用场景：分类比较、排名展示。\n\n---\n\n## 纵向条形图（类别 ≤ 10）\n\n```python\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nplt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']\nplt.rcParams['axes.unicode_minus'] = False\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\nbars = ax.bar(df['category'], df['value'],\n              color='#3b82f6', width=0.6, edgecolor='white')\n\n# 柱顶标注数值\nfor bar in bars:\n    h = bar.get_height()\n    ax.text(bar.get_x() + bar.get_width()/2, h + max(df['value'])*0.01,\n            f'{h:,.0f}', ha='center', va='bottom', fontsize=10)\n\nax.set_title('各品类销售额', fontsize=15, fontweight='bold', pad=12)\nax.set_xlabel('品类')\nax.set_ylabel('销售额（万元）')\nax.set_ylim(0, max(df['value']) * 1.15)  # 留出标注空间\nax.grid(axis='y', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 横向条形图（排名 / 类别多 / 名称长）\n\n```python\n# 按值排序，最大值在顶部\ndf_sorted = df.sort_values('value', ascending=True)\n\nfig, ax = plt.subplots(figsize=(10, max(6, len(df_sorted) * 0.4)))\n\n# 高亮 Top 1\ncolors = ['#ef4444' if i == len(df_sorted)-1 else '#3b82f6'\n          for i in range(len(df_sorted))]\n\nbars = ax.barh(df_sorted['name'], df_sorted['value'],\n               color=colors, height=0.6)\n\n# 右侧标注数值\nfor bar in bars:\n    w = bar.get_width()\n    ax.text(w + max(df_sorted['value'])*0.01, bar.get_y() + bar.get_height()/2,\n            f'{w:,.0f}', va='center', fontsize=10)\n\nax.set_title('Top 用户消费排名', fontsize=15, fontweight='bold', pad=12)\nax.set_xlabel('消费金额（元）')\nax.set_xlim(0, max(df_sorted['value']) * 1.12)\nax.grid(axis='x', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('bar_horizontal.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 分组条形图（多系列对比）\n\n```python\n# df 列：month, group_a, group_b, group_c\ncategories = df['month'].tolist()\nx = np.arange(len(categories))\nwidth = 0.25\nPALETTE = ['#3b82f6', '#10b981', '#f59e0b']\n\nfig, ax = plt.subplots(figsize=(12, 6))\n\nfor i, (col, label) in enumerate([('group_a', 'PC端'), ('group_b', '移动端'), ('group_c', '小程序')]):\n    offset = (i - 1) * width\n    bars = ax.bar(x + offset, df[col], width, label=label,\n                  color=PALETTE[i], edgecolor='white')\n\nax.set_xticks(x)\nax.set_xticklabels(categories)\nax.legend()\nax.set_title('各渠道月度订单量对比', fontsize=15, fontweight='bold')\nax.grid(axis='y', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('grouped_bar.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 堆叠条形图（占比构成）\n\n```python\nfig, ax = plt.subplots(figsize=(12, 6))\nPALETTE = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444']\n\nbottom = np.zeros(len(df))\nfor i, col in enumerate(['cat_a', 'cat_b', 'cat_c', 'cat_d']):\n    ax.bar(df['month'], df[col], bottom=bottom,\n           label=col, color=PALETTE[i], edgecolor='white', linewidth=0.5)\n    bottom += df[col].values\n\nax.legend(loc='upper left')\nax.set_title('各品类月度销售额构成', fontsize=15, fontweight='bold')\nax.grid(axis='y', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('stacked_bar.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 百分比堆叠条形图\n\n```python\n# 先计算百分比\ncols = ['cat_a', 'cat_b', 'cat_c']\ndf_pct = df[cols].div(df[cols].sum(axis=1), axis=0) * 100\n\nfig, ax = plt.subplots(figsize=(12, 6))\nbottom = np.zeros(len(df_pct))\n\nfor i, col in enumerate(cols):\n    ax.bar(df['month'], df_pct[col], bottom=bottom,\n           label=col, color=PALETTE[i], edgecolor='white')\n    bottom += df_pct[col].values\n\nax.set_ylim(0, 100)\nax.set_ylabel('占比（%）')\nax.legend(loc='upper left')\nax.set_title('各品类月度销售额占比', fontsize=15, fontweight='bold')\n\nplt.tight_layout()\nplt.savefig('stacked_pct.png', dpi=150, bbox_inches='tight')\n```\n\nFile v1.0.0:references/canvas-render.md\n\n# Canvas 内嵌渲染\n\n在对话中直接渲染图表，无需保存文件，用户即时看到结果。\n\n---\n\n## 什么时候用 Canvas 渲染\n\n- 用户想在对话里直接看图，不想保存文件\n- 快速验证图表效果\n- 演示/汇报场景，需要即时展示\n\n---\n\n## 使用方式\n\n通过 `canvas` 工具的 `eval` action 执行 JavaScript，渲染 Chart.js 图表。\n\n### 折线图示例\n\n```javascript\n// canvas eval 内容\nconst ctx = document.getElementById('chart').getContext('2d');\nnew Chart(ctx, {\n  type: 'line',\n  data: {\n    labels: ['1月', '2月', '3月', '4月', '5月', '6月'],\n    datasets: [{\n      label: '订单量',\n      data: [1200, 1900, 1500, 2100, 2400, 2800],\n      borderColor: '#3b82f6',\n      backgroundColor: 'rgba(59,130,246,0.1)',\n      borderWidth: 2,\n      fill: true,\n      tension: 0.4,\n      pointRadius: 4\n    }]\n  },\n  options: {\n    responsive: true,\n    plugins: {\n      title: { display: true, text: '月度订单量趋势', font: { size: 16 } },\n      legend: { position: 'top' }\n    },\n    scales: {\n      y: { beginAtZero: true, grid: { color: 'rgba(0,0,0,0.05)' } }\n    }\n  }\n});\n```\n\n### Canvas HTML 模板\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n  <style>\n    body { font-family: 'Microsoft YaHei', sans-serif; padding: 20px; background: #fff; }\n    .chart-container { max-width: 800px; margin: 0 auto; }\n  </style>\n</head>\n<body>\n  <div class=\"chart-container\">\n    <canvas id=\"chart\"></canvas>\n  </div>\n  <script>\n    // 在这里放图表代码\n  </script>\n</body>\n</html>\n```\n\n---\n\n## Chart.js 常用图表类型\n\n| type 值 | 图表类型 |\n|---------|---------|\n| `'line'` | 折线图 |\n| `'bar'` | 条形图（纵向） |\n| `'bar'` + `indexAxis: 'y'` | 横向条形图 |\n| `'pie'` | 饼图（慎用） |\n| `'doughnut'` | 环形图 |\n| `'scatter'` | 散点图 |\n| `'bubble'` | 气泡图 |\n| `'radar'` | 雷达图 |\n\n---\n\n## 多系列条形图示例\n\n```javascript\nnew Chart(ctx, {\n  type: 'bar',\n  data: {\n    labels: ['Q1', 'Q2', 'Q3', 'Q4'],\n    datasets: [\n      {\n        label: 'PC端',\n        data: [3200, 4100, 3800, 5200],\n        backgroundColor: '#3b82f6'\n      },\n      {\n        label: '移动端',\n        data: [5100, 6200, 7100, 8900],\n        backgroundColor: '#10b981'\n      }\n    ]\n  },\n  options: {\n    responsive: true,\n    plugins: {\n      title: { display: true, text: '各渠道季度订单量' }\n    },\n    scales: { y: { beginAtZero: true } }\n  }\n});\n```\n\n---\n\n## 注意事项\n\n- Canvas 渲染依赖网络加载 Chart.js CDN，离线环境需本地引入\n- 数据量大时（>1000 点），建议先聚合再渲染，避免卡顿\n- 中文字体在 Canvas 中需要系统已安装对应字体\n- 复杂统计图（箱线图、小提琴图）建议用 Python matplotlib 生成图片，再展示\n\nFile v1.0.0:references/chart-guidelines.md\n\n# 图表选型指南\n\n根据数据类型和报告目标选择最合适的图表。\n\n---\n\n## 核心原则\n\n**图表存在的意义是传达信息，不是展示数据。**\n\n选择图表前先问自己：\n1. 我想传达什么信息？\n2. 读者最关心什么？\n3. 这个图表能让读者快速理解吗？\n\n---\n\n## 决策矩阵\n\n### 按数据关系选图\n\n| 数据关系 | 推荐图表 | 适用场景 | 避免使用 |\n|---------|---------|---------|---------|\n| **时间趋势** | 折线图 | 销售趋势、用户增长 | 饼图、散点图 |\n| **分类比较** | 横向条形图 | 品类排名、区域对比 | 折线图（类别少时） |\n| **占比构成** | 堆叠条形图 | 渠道占比、成本构成 | 饼图（>5类时） |\n| **数值分布** | 直方图/箱线图 | 订单金额分布、薪资分布 | 条形图 |\n| **两变量关系** | 散点图 | 价格vs销量、投入vs产出 | 折线图 |\n| **流程转化** | 漏斗图 | 购买漏斗、招聘漏斗 | 条形图 |\n| **多维对比** | 热力图 | Cohort留存、相关性矩阵 | 多个折线图 |\n| **地理分布** | 地图 | 区域销售、用户分布 | 条形图 |\n| **进度达成** | 进度条/仪表盘 | 目标达成率、KPI进度 | 折线图 |\n| **单一指标** | 大数字卡片 | 总营收、总用户数 | 任何图表 |\n\n---\n\n## 报告类型 vs 图表组合\n\n### 周报/月报\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（4个核心指标）              │\n├─────────────────────────────────────┤\n│  折线图（趋势）+ 洞察文字             │\n├────────────────────┬────────────────┤\n│  横向条形图（排名） │  堆叠图（构成）  │\n├────────────────────┼────────────────┤\n│  漏斗图（转化）     │  表格（明细）    │\n└────────────────────┴────────────────┘\n```\n\n### 财务报表\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（收入/利润/成本/费用）      │\n├─────────────────────────────────────┤\n│  环形图（成本构成）                  │\n├────────────────────┬────────────────┤\n│  堆叠条形图（收入构成）│  折线图（趋势）│\n├────────────────────┴────────────────┤\n│  表格（明细科目）                    │\n└─────────────────────────────────────┘\n```\n\n### 漏斗报告\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（整体转化率/各阶段转化率）  │\n├─────────────────────────────────────┤\n│  漏斗图（全宽）                      │\n├────────────────────┬────────────────┤\n│  分组漏斗（渠道对比）│  条形图（流失原因）│\n├────────────────────┴────────────────┤\n│  洞察 + 优化建议                     │\n└─────────────────────────────────────┘\n```\n\n### 留存报告\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（次日留存/7日留存/30日留存）│\n├─────────────────────────────────────┤\n│  Cohort 热力图（全宽）               │\n├────────────────────┬────────────────┤\n│  折线图（留存曲线） │  条形图（渠道对比）│\n└────────────────────┴────────────────┘\n```\n\n---\n\n## 图表设计规范\n\n### 折线图\n```python\n# 最佳实践\nfig, ax = plt.subplots(figsize=(11, 4))\nax.plot(df['date'], df['value'], linewidth=2.2, color='#3b82f6')\nax.fill_between(df['date'], df['value'], alpha=0.1, color='#3b82f6')  # 填充区域\n\n# 7日均线\nma7 = df['value'].rolling(7).mean()\nax.plot(df['date'], ma7, linewidth=1.5, linestyle='--', color='#f59e0b')\n\n# 峰值标注\nmax_idx = df['value'].idxmax()\nax.annotate(f\"峰值 {df.loc[max_idx, 'value']:,}\",\n            xy=(df.loc[max_idx, 'date'], df.loc[max_idx, 'value']),\n            xytext=(5, 5), textcoords='offset points')\n\n# 设计规范\nax.grid(axis='y', alpha=0.2, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n```\n\n**何时使用：**\n- 数据点 > 10 个\n- 需要展示趋势\n- 需要比较多条线（≤5条）\n\n**避免：**\n- 数据点 < 5 个（用条形图）\n- 多条线交叉严重（分图展示）\n\n### 条形图\n```python\n# 横向条形图（推荐，适合类别名称较长）\ndf_sorted = df.sort_values('value', ascending=True)\nfig, ax = plt.subplots(figsize=(7, 5))\nbars = ax.barh(df_sorted['category'], df_sorted['value'],\n               color='#3b82f6', height=0.6)\n\n# 数值标注\nfor bar in bars:\n    width = bar.get_width()\n    ax.text(width + max_val*0.02, bar.get_y() + bar.get_height()/2,\n            f'{width:,.0f}', va='center')\n\n# Y轴从0开始（必须）\nax.set_xlim(0, max_val * 1.15)\n```\n\n**何时使用：**\n- 分类比较\n- 排名展示\n- 类别名称较长（横向）\n\n**避免：**\n- Y轴不从0开始\n- 类别超过15个（合并\"其他\"）\n\n### 饼图/环形图\n```python\n# 环形图（比饼图更好）\nfig, ax = plt.subplots(figsize=(6, 6))\nwedges, texts, autotexts = ax.pie(\n    df['value'], labels=df['category'],\n    autopct='%1.1f%%', pctdistance=0.75,\n    colors=PALETTE[:len(df)]\n)\n# 中心留白\ncentre_circle = plt.Circle((0, 0), 0.5, fc='white')\nax.add_artist(centre_circle)\n```\n\n**何时使用：**\n- 类别 ≤ 5 个\n- 需要展示\"占比\"概念\n- 一眼看清构成\n\n**避免：**\n- 类别 > 5 个（用堆叠条形图）\n- 3D 饼图（永远不要用）\n- 需要精确比较数值\n\n### 漏斗图\n```python\nfrom matplotlib.patches import FancyBboxPatch\n\nfig, ax = plt.subplots(figsize=(5, 4))\nax.set_xlim(0, 1)\nax.set_ylim(0, len(labels))\nax.axis('off')\n\nfor i, (label, val) in enumerate(zip(reversed(labels), reversed(values))):\n    pct = val / values[0]\n    width = 0.2 + 0.8 * pct\n    left = (1 - width) / 2\n    \n    rect = FancyBboxPatch(\n        (left, i*0.18+0.02), width, 0.15,\n        boxstyle=\"round,pad=0.01\",\n        facecolor=colors[i]\n    )\n    ax.add_patch(rect)\n    ax.text(0.5, i*0.18+0.095,\n            f'{label}  {val:,}  ({pct*100:.1f}%)',\n            ha='center', va='center',\n            color='white', fontweight='bold')\n```\n\n### 热力图（Cohort）\n```python\nimport seaborn as sns\n\nfig, ax = plt.subplots(figsize=(10, 6))\nsns.heatmap(\n    cohort_matrix,\n    annot=True, fmt='.1f',\n    cmap='Blues',\n    cbar_kws={'label': '留存率(%)'},\n    ax=ax\n)\nax.set_xlabel('留存周期')\nax.set_ylabel('注册周')\n```\n\n---\n\n## 颜色使用规范\n\n### 单系列\n```python\nPRIMARY = '#3b82f6'  # 主色\n```\n\n### 多系列（色盲友好）\n```python\nPALETTE = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4']\n```\n\n### 正负对比\n```python\n# 国内股市风格：绿涨红跌\nUP   = '#10b981'\nDOWN = '#ef4444'\n\n# 欧美股市风格：红涨绿跌\nUP   = '#ef4444'\nDOWN = '#10b981'\n```\n\n### 渐变色\n```python\nimport matplotlib.cm as cm\ncmap = cm.get_cmap('Blues')\ncolors = [cmap(0.3 + 0.7 * i/len(df)) for i in range(len(df))]\n```\n\nFile v1.0.0:references/chart-planning.md\n\n# 图表规划指南\n\n根据报告类型和数据特征，确定最佳图表组合。\n\n---\n\n## 报告类型 vs 图表组合\n\n### 业务周报/月报（默认模板）\n```\n┌─────────────────────────────────────────┐\n│  KPI 卡片行（4 个核心指标）               │\n├─────────────────────────────────────────┤\n│  趋势图（全宽）- 时间序列 + 洞察         │\n├────────────────────┬────────────────────┤\n│  分类对比图        │  维度拆解图         │\n│  （横向条形图）    │  （堆叠条形图）      │\n├────────────────────┼────────────────────┤\n│  漏斗/流程图       │  明细表格            │\n│  （转化分析）      │  （带条件格式）      │\n└────────────────────┴────────────────────┘\n```\n\n### 转化漏斗分析报告\n```\n┌─────────────────────────────────────────┐\n│  KPI 卡片行（转化率、流失率、平均时长）   │\n├─────────────────────────────────────────┤\n│  主漏斗图（全宽）- 各阶段转化率           │\n├────────────────────┬────────────────────┤\n│  分渠道漏斗对比    │  流失原因分析        │\n│  （分组漏斗）      │  （横向条形图）      │\n├────────────────────┴────────────────────┤\n│  优化建议（洞察文字）                     │\n└─────────────────────────────────────────┘\n```\n\n### 销售业绩看板\n```\n┌─────────────────────────────────────────┐\n│  KPI 卡片行（销售额、订单量、客单价、目标达成率）│\n├─────────────────────────────────────────┤\n│  趋势图 + 目标线（全宽）                  │\n├────────────────────┬────────────────────┤\n│  Top 销售员/产品   │  区域分布            │\n│  （横向条形图）    │  （地图/热力图）      │\n├────────────────────┼────────────────────┤\n│  品类占比          │  增长排名            │\n│  （饼图/环形图）   │  （双向条形图）       │\n└────────────────────┴────────────────────┘\n```\n\n---\n\n## 图表选型决策矩阵\n\n| 数据维度 | 1 个指标 | 2-3 个指标 | 4+ 个指标 |\n|---------|---------|-----------|----------|\n| 时间序列 | 折线图 | 多系列折线 | 面积堆叠 |\n| 分类对比 | 横向条形图 | 分组条形图 | 热力图 |\n| 占比构成 | 饼图（<5 类） | 堆叠条形图 | 矩形树图 |\n| 相关性 | 散点图 | 气泡图 | 相关矩阵热力图 |\n| 分布 | 直方图 | 箱线图 | 小提琴图 |\n| 流程 | 漏斗图 | 分组漏斗 | 桑基图 |\n\n---\n\n## 报告布局原则\n\n### 视觉层级\n1. **顶部**：最重要的 KPI（用户第一眼看到）\n2. **中上**：趋势图（回答\"整体情况如何\"）\n3. **中部**：对比图（回答\"哪里好/哪里差\"）\n4. **下部**：明细表格（回答\"具体数据是什么\"）\n5. **底部**：洞察建议（回答\"接下来做什么\"）\n\n### 信息密度\n- **高管版**：3-4 个 KPI + 1 张趋势图 + 3 条洞察\n- **运营版**：完整布局 + 明细表格\n- **客户版**：精选 KPI + 核心结论 + 品牌元素\n\n### 颜色使用\n- 同类数据用同色\n- 高亮重点数据用对比色\n- 正向指标用绿色，负向用红色（或按品牌色）\n- 最多使用 6 种颜色（色盲友好）\n\n---\n\n## 常见场景速查\n\n| 业务问题 | 推荐图表组合 |\n|---------|-------------|\n| 销售趋势如何？ | 折线图 + 环比条形图 |\n| 哪个品类表现最好？ | 横向条形图（Top 排名） |\n| 渠道贡献占比？ | 堆叠条形图 + 饼图 |\n| 转化率怎么样？ | 漏斗图 + 分渠道漏斗 |\n| 用户留存情况？ | Cohort 热力图 |\n| 各区域对比？ | 地图 + 横向条形图 |\n| 目标达成情况？ | 折线图 + 目标线 + 进度条 |\n\nFile v1.0.0:references/chart-selection.md\n\n# 图表选型决策指南\n\n## 核心问题：你想表达什么？\n\n拿到数据后，先问自己这个问题，再选图表。\n\n---\n\n## 决策树\n\n```\n数据是什么关系？\n│\n├── 随时间变化？\n│   ├── 连续时间序列 → 折线图\n│   ├── 离散时间点比较 → 分组条形图\n│   └── 累计/占比随时间变化 → 堆叠面积图\n│\n├── 分类之间比较？\n│   ├── 类别 ≤ 10 → 纵向条形图\n│   ├── 类别 > 10 或名称较长 → 横向条形图\n│   ├── 多组对比 → 分组条形图\n│   └── 排名展示 → 横向条形图（降序）\n│\n├── 整体中各部分占比？\n│   ├── 类别 ≤ 5 → 堆叠条形图（推荐）或饼图\n│   ├── 类别 > 5 → 矩形树图（Treemap）\n│   └── 占比随时间变化 → 堆叠面积图（百分比）\n│\n├── 数值分布？\n│   ├── 单变量分布 → 直方图\n│   ├── 多组分布对比 → 箱线图 / 小提琴图\n│   └── 密度估计 → KDE 图\n│\n├── 两变量关系？\n│   ├── 相关性探索 → 散点图\n│   ├── 带趋势线 → 回归散点图\n│   └── 多变量相关矩阵 → 热力图\n│\n├── 地理分布？\n│   └── 地图（Choropleth / 气泡地图）\n│\n├── 流向/转化？\n│   ├── 用户转化漏斗 → 漏斗图\n│   └── 流量流向 → 桑基图（Sankey）\n│\n└── 单一关键指标？\n    └── 大数字 KPI 卡片（不需要图表）\n```\n\n---\n\n## 常见场景速查\n\n| 业务场景 | 推荐图表 | 示例 |\n|---------|---------|------|\n| 日/周/月销售趋势 | 折线图 | 近 30 天 GMV |\n| 各品类销售额对比 | 横向条形图 | Top 10 品类 |\n| 用户地区分布 | 横向条形图 / 地图 | 各省用户数 |\n| 订单金额分布 | 直方图 | 0-100/100-500/500+ |\n| 各渠道转化率对比 | 分组条形图 | PC vs 移动端 |\n| 用户留存率 | 热力图（Cohort） | 按注册周分组 |\n| 指标相关性 | 热力图 | 价格/销量/评分 |\n| 漏斗转化 | 漏斗图 | 曝光→点击→购买 |\n| 月度环比增长 | 折线图 + 柱状图组合 | 销售额 + 增长率 |\n| 市场份额 | 堆叠条形图 | 各品牌占比 |\n\n---\n\n## 反模式（常见错误）\n\n### ❌ 饼图滥用\n```\n错误：用饼图展示 10 个品类的销售占比\n原因：人眼无法准确比较扇形大小\n正确：横向条形图，按值排序\n```\n\n### ❌ 双 Y 轴滥用\n```\n错误：左轴销售额（万元），右轴增长率（%），两条线看起来相关\n原因：双 Y 轴可以通过调整比例制造任意\"相关性\"\n正确：分两张图，或用散点图展示真实相关性\n```\n\n### ❌ 截断 Y 轴\n```\n错误：条形图 Y 轴从 95 开始，让微小差异看起来很大\n原因：视觉误导\n正确：Y 轴从 0 开始；如果确实需要放大差异，用折线图并明确标注\n```\n\n### ❌ 3D 图表\n```\n错误：3D 饼图、3D 条形图\n原因：透视变形导致读值不准\n正确：永远用 2D\n```\n\n### ❌ 彩虹配色\n```\n错误：每个柱子用不同颜色，没有语义\n原因：颜色应该传达信息，不是装饰\n正确：同类数据用同色；用颜色高亮重点数据\n```\n\nFile v1.0.0:references/cli-quickref.md\n\n# CLI 实操速查\n\n数据库命令行工具的常用操作速查，适合直接上手。\n\n---\n\n## SQLite\n\nSQLite 内置于 Python，零配置，适合本地开发和原型验证。\n\n### 连接与基本操作\n```bash\n# 打开/创建数据库\nsqlite3 mydb.sqlite\n\n# 单行查询（不进入交互模式）\nsqlite3 mydb.sqlite \"SELECT COUNT(*) FROM users;\"\n\n# 交互模式开启表头和列对齐\nsqlite3 -header -column mydb.sqlite\n```\n\n### 数据导入导出\n```bash\n# 导入 CSV\nsqlite3 mydb.sqlite \".mode csv\" \".import data.csv mytable\" \"SELECT COUNT(*) FROM mytable;\"\n\n# 导出为 CSV\nsqlite3 -header -csv mydb.sqlite \"SELECT * FROM orders;\" > orders.csv\n\n# 导出整个数据库为 SQL\nsqlite3 mydb.sqlite .dump > backup.sql\n\n# 从 SQL 文件恢复\nsqlite3 mydb.sqlite < backup.sql\n```\n\n### 常用 Meta 命令\n```\n.tables              -- 列出所有表\n.schema users        -- 查看表结构\n.indexes users       -- 查看索引\n.mode column         -- 列对齐显示\n.headers on          -- 显示列名\n.quit                -- 退出\n```\n\n### 关键 PRAGMA\n```sql\nPRAGMA journal_mode = WAL;        -- 提升并发写入性能\nPRAGMA synchronous = NORMAL;      -- 平衡安全与性能\nPRAGMA foreign_keys = ON;         -- 启用外键约束（默认关闭！）\nPRAGMA cache_size = -64000;       -- 设置缓存 64MB\nPRAGMA temp_store = MEMORY;       -- 临时表放内存\nPRAGMA integrity_check;           -- 数据库完整性检查\n```\n\n---\n\n## PostgreSQL\n\n### 连接\n```bash\n# 基本连接\npsql -h localhost -U myuser -d mydb\n\n# 连接字符串\npsql \"postgresql://user:pass@localhost:5432/mydb?sslmode=require\"\n\n# 单行查询\npsql -h localhost -U myuser -d mydb -c \"SELECT NOW();\"\n\n# 执行 SQL 文件\npsql -h localhost -U myuser -d mydb -f migration.sql\n\n# 列出所有数据库\npsql -l\n```\n\n### 数据导入导出\n```bash\n# 导出整个数据库\npg_dump -h localhost -U myuser mydb > backup.sql\n\n# 导出为自定义格式（推荐，支持并行恢复）\npg_dump -h localhost -U myuser -Fc mydb > backup.dump\n\n# 恢复\npsql -h localhost -U myuser mydb < backup.sql\npg_restore -h localhost -U myuser -d mydb backup.dump\n\n# 导出单表为 CSV\npsql -h localhost -U myuser -d mydb -c \"\\COPY orders TO 'orders.csv' CSV HEADER\"\n\n# 导入 CSV\npsql -h localhost -U myuser -d mydb -c \"\\COPY orders FROM 'orders.csv' CSV HEADER\"\n```\n\n### 常用 Meta 命令\n```\n\\l                   -- 列出数据库\n\\c mydb              -- 切换数据库\n\\dt                  -- 列出表\n\\d users             -- 查看表结构（含索引）\n\\di                  -- 列出索引\n\\df                  -- 列出函数\n\\timing              -- 显示查询耗时\n\\x                   -- 切换扩展显示模式（宽表友好）\n\\e                   -- 用编辑器编辑查询\n\\q                   -- 退出\n```\n\n### 性能诊断\n```sql\n-- 查看慢查询（需开启 pg_stat_statements）\nSELECT query, calls, mean_exec_time, total_exec_time\nFROM pg_stat_statements\nORDER BY mean_exec_time DESC\nLIMIT 10;\n\n-- 查看表大小\nSELECT relname, pg_size_pretty(pg_total_relation_size(relid))\nFROM pg_stat_user_tables\nORDER BY pg_total_relation_size(relid) DESC;\n\n-- 查看锁等待\nSELECT pid, wait_event_type, wait_event, query\nFROM pg_stat_activity\nWHERE wait_event IS NOT NULL;\n\n-- 终止慢查询\nSELECT pg_terminate_backend(pid)\nFROM pg_stat_activity\nWHERE query_start < NOW() - INTERVAL '5 minutes'\n  AND state = 'active';\n```\n\n---\n\n## MySQL / MariaDB\n\n### 连接\n```bash\n# 基本连接\nmysql -h localhost -u myuser -p mydb\n\n# 单行查询\nmysql -h localhost -u myuser -p mydb -e \"SELECT NOW();\"\n\n# 执行 SQL 文件\nmysql -h localhost -u myuser -p mydb < migration.sql\n\n# 不显示密码警告（脚本用）\nmysql --defaults-extra-file=~/.my.cnf mydb -e \"SELECT 1;\"\n```\n\n### ~/.my.cnf 配置（避免明文密码）\n```ini\n[client]\nhost=localhost\nuser=myuser\npassword=mypassword\n```\n\n### 数据导入导出\n```bash\n# 导出整个数据库\nmysqldump -h localhost -u myuser -p mydb > backup.sql\n\n# 导出单表\nmysqldump -h localhost -u myuser -p mydb orders > orders.sql\n\n# 恢复\nmysql -h localhost -u myuser -p mydb < backup.sql\n\n# 导出为 CSV（需 FILE 权限）\nmysql -h localhost -u myuser -p mydb -e \\\n  \"SELECT * FROM orders INTO OUTFILE '/tmp/orders.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\\\"' LINES TERMINATED BY '\\n';\"\n```\n\n### 常用 Meta 命令\n```sql\nSHOW DATABASES;\nUSE mydb;\nSHOW TABLES;\nDESCRIBE users;           -- 查看表结构\nSHOW CREATE TABLE users;  -- 查看建表语句（含索引）\nSHOW INDEX FROM users;    -- 查看索引详情\nSHOW PROCESSLIST;         -- 查看当前连接和查询\nSHOW VARIABLES LIKE 'innodb%';  -- 查看 InnoDB 配置\n```\n\n### 性能诊断\n```sql\n-- 查看慢查询日志状态\nSHOW VARIABLES LIKE 'slow_query%';\nSHOW VARIABLES LIKE 'long_query_time';\n\n-- 开启慢查询（临时）\nSET GLOBAL slow_query_log = 'ON';\nSET GLOBAL long_query_time = 1;  -- 超过 1 秒记录\n\n-- 查看 InnoDB 状态（锁、事务）\nSHOW ENGINE INNODB STATUS\\G\n\n-- 查看当前锁等待\nSELECT * FROM information_schema.INNODB_LOCK_WAITS;\n\n-- 终止慢查询\nKILL QUERY <pid>;\n```\n\n---\n\n## 通用技巧\n\n### EXPLAIN 快速解读\n```sql\n-- MySQL\nEXPLAIN SELECT ...;\nEXPLAIN FORMAT=JSON SELECT ...;   -- 更详细\n\n-- PostgreSQL\nEXPLAIN SELECT ...;\nEXPLAIN (ANALYZE, BUFFERS) SELECT ...;  -- 实际执行 + 缓存命中\n\n-- 关注指标\n-- type: ALL（全表扫描，危险）→ ref/eq_ref/const（索引，好）\n-- rows: 预估扫描行数，越小越好\n-- Extra: Using filesort / Using temporary（需优化）\n```\n\n### 快速生成测试数据\n```sql\n-- MySQL：生成 10000 行测试数据\nINSERT INTO test_table (name, value, created_at)\nSELECT\n  CONCAT('user_', seq),\n  FLOOR(RAND() * 1000),\n  DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 365) DAY)\nFROM (\n  SELECT @row := @row + 1 AS seq\n  FROM information_schema.columns, (SELECT @row := 0) r\n  LIMIT 10000\n) t;\n\n-- PostgreSQL：generate_series\nINSERT INTO test_table (name, value, created_at)\nSELECT\n  'user_' || i,\n  (RANDOM() * 1000)::INT,\n  NOW() - (RANDOM() * 365 || ' days')::INTERVAL\nFROM generate_series(1, 10000) AS i;\n\n-- SQLite\nWITH RECURSIVE cnt(x) AS (\n  SELECT 1 UNION ALL SELECT x+1 FROM cnt WHERE x < 10000\n)\nINSERT INTO test_table (name, value)\nSELECT 'user_' || x, ABS(RANDOM() % 1000) FROM cnt;\n```\n\nFile v1.0.0:references/dashboard.md\n\n# 多图面板 / Dashboard\n\n适用场景：需要在一张图里展示多个维度，或生成完整的数据报告。\n\n---\n\n## matplotlib 多图面板\n\n```python\nimport matplotlib.pyplot as plt\nimport matplotlib.gridspec as gridspec\nimport seaborn as sns\nimport pandas as pd\nimport numpy as np\n\nplt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']\nplt.rcParams['axes.unicode_minus'] = False\n\nfig = plt.figure(figsize=(16, 10))\nfig.suptitle('业务数据周报', fontsize=20, fontweight='bold', y=0.98)\n\n# 使用 GridSpec 灵活布局\ngs = gridspec.GridSpec(2, 3, figure=fig, hspace=0.4, wspace=0.35)\n\n# ── 左上（跨2列）：趋势折线图 ──\nax1 = fig.add_subplot(gs[0, :2])\nax1.plot(df_trend['date'], df_trend['orders'], color='#3b82f6', linewidth=2)\nax1.fill_between(df_trend['date'], df_trend['orders'], alpha=0.1, color='#3b82f6')\nax1.set_title('近30天订单量趋势', fontweight='bold')\nax1.grid(axis='y', alpha=0.3)\nax1.spines['top'].set_visible(False)\nax1.spines['right'].set_visible(False)\nax1.tick_params(axis='x', rotation=45)\n\n# ── 右上：KPI 卡片 ──\nax2 = fig.add_subplot(gs[0, 2])\nax2.axis('off')\nkpis = [\n    ('总订单量', '12,450', '+8.3%', '#10b981'),\n    ('总营收', '¥234万', '+12.1%', '#10b981'),\n    ('客单价', '¥188', '-2.4%', '#ef4444'),\n]\nfor i, (label, value, change, color) in enumerate(kpis):\n    y_pos = 0.85 - i * 0.3\n    ax2.text(0.1, y_pos, label, fontsize=10, color='#6b7280', transform=ax2.transAxes)\n    ax2.text(0.1, y_pos - 0.1, value, fontsize=18, fontweight='bold', transform=ax2.transAxes)\n    ax2.text(0.7, y_pos - 0.1, change, fontsize=12, color=color, transform=ax2.transAxes)\nax2.set_title('核心指标', fontweight='bold')\n\n# ── 左下：品类条形图 ──\nax3 = fig.add_subplot(gs[1, 0])\ndf_cat_sorted = df_cat.sort_values('value', ascending=True)\nax3.barh(df_cat_sorted['name'], df_cat_sorted['value'], color='#3b82f6', height=0.6)\nax3.set_title('品类销售额 Top 5', fontweight='bold')\nax3.spines['top'].set_visible(False)\nax3.spines['right'].set_visible(False)\n\n# ── 中下：金额分布直方图 ──\nax4 = fig.add_subplot(gs[1, 1])\nax4.hist(df_orders['amount'], bins=20, color='#f59e0b', edgecolor='white')\nax4.set_title('订单金额分布', fontweight='bold')\nax4.set_xlabel('金额（元）')\nax4.spines['top'].set_visible(False)\nax4.spines['right'].set_visible(False)\n\n# ── 右下：渠道占比堆叠 ──\nax5 = fig.add_subplot(gs[1, 2])\nbottom = np.zeros(len(df_channel))\nfor col, color in zip(['pc', 'mobile', 'mini'], ['#3b82f6', '#10b981', '#f59e0b']):\n    ax5.bar(df_channel['month'], df_channel[col], bottom=bottom,\n            label=col, color=color, edgecolor='white')\n    bottom += df_channel[col].values\nax5.legend(fontsize=8)\nax5.set_title('渠道构成', fontweight='bold')\nax5.spines['top'].set_visible(False)\nax5.spines['right'].set_visible(False)\n\nplt.savefig('weekly_report.png', dpi=150, bbox_inches='tight')\nprint(\"报告已保存：weekly_report.png\")\n```\n\n---\n\n## 自动化报告生成（SQL → 图表 → PDF）\n\n```python\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom matplotlib.backends.backend_pdf import PdfPages\nimport sqlite3\nfrom datetime import datetime\n\nplt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']\nplt.rcParams['axes.unicode_minus'] = False\n\nconn = sqlite3.connect('mydb.sqlite')\n\n# 查询数据\ndf_trend = pd.read_sql(\"\"\"\n    SELECT DATE(created_at) as date, COUNT(*) as orders, SUM(amount) as revenue\n    FROM orders WHERE created_at >= DATE('now', '-30 days')\n    GROUP BY DATE(created_at) ORDER BY date\n\"\"\", conn)\n\ndf_cat = pd.read_sql(\"\"\"\n    SELECT category, SUM(amount) as revenue\n    FROM orders WHERE created_at >= DATE('now', '-30 days')\n    GROUP BY category ORDER BY revenue DESC LIMIT 10\n\"\"\", conn)\n\nconn.close()\n\n# 生成 PDF 报告\nwith PdfPages(f'report_{datetime.now().strftime(\"%Y%m%d\")}.pdf') as pdf:\n\n    # 第1页：趋势\n    fig, ax = plt.subplots(figsize=(12, 5))\n    ax.plot(pd.to_datetime(df_trend['date']), df_trend['revenue'],\n            color='#3b82f6', linewidth=2)\n    ax.set_title('近30天营收趋势', fontsize=14, fontweight='bold')\n    ax.grid(axis='y', alpha=0.3)\n    plt.tight_layout()\n    pdf.savefig(fig)\n    plt.close()\n\n    # 第2页：品类排名\n    fig, ax = plt.subplots(figsize=(10, 7))\n    df_sorted = df_cat.sort_values('revenue', ascending=True)\n    ax.barh(df_sorted['category'], df_sorted['revenue'], color='#10b981')\n    ax.set_title('品类营收排名', fontsize=14, fontweight='bold')\n    plt.tight_layout()\n    pdf.savefig(fig)\n    plt.close()\n\n    # PDF 元数据\n    d = pdf.infodict()\n    d['Title'] = '业务数据报告'\n    d['Author'] = 'SQL DataViz'\n    d['CreationDate'] = datetime.now()\n\nprint(f\"PDF 报告已生成：report_{datetime.now().strftime('%Y%m%d')}.pdf\")\n```\n\n---\n\n## 布局建议\n\n| 图表数量 | 推荐布局 | figsize |\n|---------|---------|---------|\n| 2 张 | 1×2 或 2×1 | (14, 5) 或 (8, 10) |\n| 4 张 | 2×2 | (14, 10) |\n| 6 张 | 2×3 或 3×2 | (16, 10) |\n| 混合（大+小） | GridSpec 自定义 | 按需 |\n\n**原则：** 最重要的图放左上角（视线自然落点），KPI 卡片放右上角，细节图放下方。\n\nFile v1.0.0:references/data-warehouse.md\n\n# 数仓建模 & 分层架构\n\n## 数仓分层架构（标准）\n\n```\n原始数据\n    ↓\nODS（Operational Data Store）操作数据层\n    ↓\nDWD（Data Warehouse Detail）明细数据层\n    ↓\nDWS（Data Warehouse Summary）汇总数据层\n    ↓\nADS（Application Data Store）应用数据层\n    ↓\n报表 / BI / 应用\n```\n\n### 各层职责\n\n| 层 | 职责 | 特点 |\n|----|------|------|\n| ODS | 原始数据落地，不做业务加工 | 保留原始字段，全量或增量同步 |\n| DWD | 数据清洗、标准化、维度关联 | 1:1 对应业务事实，最细粒度 |\n| DWS | 按主题聚合，轻度汇总 | 按天/周/月聚合，宽表 |\n| ADS | 面向具体应用的指标 | 直接支撑报表，高度聚合 |\n\n---\n\n## 维度建模\n\n### 星型模型 vs 雪花模型\n\n```\n星型模型：\n  事实表 ← 直接关联 → 维度表（维度表不再关联其他维度表）\n  优点：查询简单，JOIN 少，性能好\n  缺点：维度表可能有冗余\n\n雪花模型：\n  事实表 ← 维度表 ← 子维度表（维度表继续规范化）\n  优点：存储空间小，无冗余\n  缺点：JOIN 多，查询复杂，性能差\n\n实践建议：OLAP 场景优先用星型模型\n```\n\n### 事实表设计\n```sql\n-- 事实表：记录业务事件，包含度量值和外键\nCREATE TABLE dwd_order_detail (\n    order_id        BIGINT          COMMENT '订单ID',\n    user_id         BIGINT          COMMENT '用户ID（关联用户维度）',\n    product_id      BIGINT          COMMENT '商品ID（关联商品维度）',\n    date_id         INT             COMMENT '日期ID（关联日期维度，格式 20240101）',\n    -- 度量值\n    quantity        INT             COMMENT '购买数量',\n    unit_price      DECIMAL(10,2)   COMMENT '单价',\n    discount_amount DECIMAL(10,2)   COMMENT '优惠金额',\n    actual_amount   DECIMAL(10,2)   COMMENT '实付金额',\n    -- 分区字段\n    dt              STRING          COMMENT '数据日期分区 yyyy-MM-dd'\n)\nCOMMENT '订单明细事实表'\nPARTITIONED BY (dt STRING)\nSTORED AS ORC;\n```\n\n### 维度表设计\n```sql\n-- 维度表：描述业务实体的属性\nCREATE TABLE dim_user (\n    user_id         BIGINT          COMMENT '用户ID',\n    username        STRING          COMMENT '用户名',\n    register_date   STRING          COMMENT '注册日期',\n    city            STRING          COMMENT '城市',\n    age_group       STRING          COMMENT '年龄段（18-24/25-34/...）',\n    user_level      STRING          COMMENT '用户等级（普通/银牌/金牌/钻石）',\n    -- SCD（缓慢变化维度）字段\n    start_date      STRING          COMMENT '该版本生效日期',\n    end_date        STRING          COMMENT '该版本失效日期（9999-12-31 表示当前有效）',\n    is_current      TINYINT         COMMENT '是否当前版本（1=是）'\n)\nCOMMENT '用户维度表'\nSTORED AS ORC;\n```\n\n---\n\n## 缓慢变化维度（SCD）\n\n### SCD Type 1：直接覆盖\n```sql\n-- 适用：不需要历史，只关心当前值\nUPDATE dim_user SET city = '上海' WHERE user_id = 1001;\n-- 缺点：历史数据丢失\n```\n\n### SCD Type 2：新增版本（最常用）\n```sql\n-- 适用：需要保留历史，分析不同时期的属性\n-- 用户从北京迁到上海时，新增一行，旧行标记失效\n\n-- 失效旧版本\nUPDATE dim_user\nSET end_date = '2024-01-14', is_current = 0\nWHERE user_id = 1001 AND is_current = 1;\n\n-- 插入新版本\nINSERT INTO dim_user VALUES\n(1001, '张三', '2020-01-01', '上海', '25-34', '金牌', '2024-01-15', '9999-12-31', 1);\n\n-- 查询某时间点的用户属性（点查）\nSELECT * FROM dim_user\nWHERE user_id = 1001\n  AND start_date <= '2024-01-10'\n  AND end_date > '2024-01-10';\n```\n\n---\n\n## 数仓常用 SQL 模式\n\n### 增量数据处理（每日 ETL）\n```sql\n-- 场景：每天增量同步订单数据到 DWD\n-- 策略：按分区覆盖写（INSERT OVERWRITE）\n\nINSERT OVERWRITE TABLE dwd_order_detail PARTITION (dt = '2024-01-15')\nSELECT\n    o.order_id,\n    o.user_id,\n    o.product_id,\n    DATE_FORMAT(o.create_time, '%Y%m%d')    AS date_id,\n    o.quantity,\n    o.unit_price,\n    COALESCE(o.discount_amount, 0)          AS discount_amount,\n    o.actual_amount,\n    '2024-01-15'                            AS dt\nFROM ods_orders o\nWHERE DATE(o.create_time) = '2024-01-15'\n  AND o.status != 'cancelled';\n```\n\n### 拉链表（全量历史快照）\n```sql\n-- 场景：记录每天的用户状态快照，支持任意时间点查询\n-- 比 SCD Type 2 更简单，适合数仓\n\n-- 每天生成当天快照\nINSERT INTO dws_user_snapshot PARTITION (dt = '2024-01-15')\nSELECT\n    user_id,\n    username,\n    status,\n    vip_level,\n    total_orders,\n    total_amount,\n    '2024-01-15' AS dt\nFROM (\n    -- 昨天快照 + 今天变更 = 今天快照\n    SELECT * FROM dws_user_snapshot WHERE dt = '2024-01-14'\n    UNION ALL\n    SELECT user_id, username, status, vip_level, ...\n    FROM ods_user_changes WHERE dt = '2024-01-15'\n) t\n-- 如果同一用户有多条，取最新的\nQUALIFY ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY dt DESC) = 1;\n```\n\n### 漏斗分析\n```sql\n-- 场景：分析用户从浏览 → 加购 → 下单 → 支付的转化漏斗\nWITH funnel AS (\n    SELECT\n        user_id,\n        MAX(CASE WHEN event = 'view'    THEN 1 ELSE 0 END) AS step1_view,\n        MAX(CASE WHEN event = 'add_cart' THEN 1 ELSE 0 END) AS step2_cart,\n        MAX(CASE WHEN event = 'order'   THEN 1 ELSE 0 END) AS step3_order,\n        MAX(CASE WHEN event = 'pay'     THEN 1 ELSE 0 END) AS step4_pay\n    FROM user_events\n    WHERE dt = '2024-01-15'\n    GROUP BY user_id\n)\nSELECT\n    SUM(step1_view)                                     AS view_cnt,\n    SUM(step2_cart)                                     AS cart_cnt,\n    SUM(step3_order)                                    AS order_cnt,\n    SUM(step4_pay)                                      AS pay_cnt,\n    ROUND(SUM(step2_cart) / SUM(step1_view) * 100, 2)  AS view_to_cart_rate,\n    ROUND(SUM(step3_order) / SUM(step2_cart) * 100, 2) AS cart_to_order_rate,\n    ROUND(SUM(step4_pay) / SUM(step3_order) * 100, 2)  AS order_to_pay_rate\nFROM funnel;\n```\n\n### 留存分析\n```sql\n-- 场景：计算用户次日留存、7日留存、30日留存\nWITH new_users AS (\n    -- 每天新注册用户\n    SELECT user_id, DATE(register_time) AS register_date\n    FROM users\n    WHERE register_time >= '2024-01-01'\n),\nactive_users AS (\n    -- 每天活跃用户\n    SELECT DISTINCT user_id, DATE(login_time) AS active_date\n    FROM user_logins\n)\nSELECT\n    n.register_date,\n    COUNT(DISTINCT n.user_id)                                           AS new_user_cnt,\n    COUNT(DISTINCT CASE WHEN DATEDIFF(a1.active_date, n.register_date) = 1  THEN n.user_id END) AS day1_retain,\n    COUNT(DISTINCT CASE WHEN DATEDIFF(a7.active_date, n.register_date) = 7  THEN n.user_id END) AS day7_retain,\n    COUNT(DISTINCT CASE WHEN DATEDIFF(a30.active_date, n.register_date) = 30 THEN n.user_id END) AS day30_retain\nFROM new_users n\nLEFT JOIN active_users a1  ON n.user_id = a1.user_id AND DATEDIFF(a1.active_date, n.register_date) = 1\nLEFT JOIN active_users a7  ON n.user_id = a7.user_id AND DATEDIFF(a7.active_date, n.register_date) = 7\nLEFT JOIN active_users a30 ON n.user_id = a30.user_id AND DATEDIFF(a30.active_date, n.register_date) = 30\nGROUP BY n.register_date\nORDER BY n.register_date;\n```\n\n---\n\n## 数据倾斜处理（Hive/Spark）\n\n```sql\n-- 症状：某些 Reduce 任务跑很久，其他早就完成了\n-- 原因：JOIN 或 GROUP BY 的 key 分布不均\n\n-- 方案 1：广播小表（Map Join）\nSELECT /*+ MAPJOIN(dim_user) */ o.*, u.username\nFROM dwd_orders o\nJOIN dim_user u ON o.user_id = u.user_id;\n\n-- 方案 2：加盐打散（处理 GROUP BY 倾斜）\n-- 第一步：加随机盐，局部聚合\nSELECT\n    CONCAT(user_id, '_', FLOOR(RAND() * 10)) AS salted_key,\n    SUM(amount) AS partial_sum\nFROM orders\nGROUP BY CONCAT(user_id, '_', FLOOR(RAND() * 10));\n\n-- 第二步：去盐，全局聚合\nSELECT\n    SPLIT(salted_key, '_')[0] AS user_id,\n    SUM(partial_sum) AS total_amount\nFROM (上面的结果)\nGROUP BY SPLIT(salted_key, '_')[0];\n\n-- 方案 3：Hive 配置（自动处理倾斜）\nSET hive.optimize.skewjoin = true;\nSET hive.skewjoin.key = 100000;  -- 超过此行数认为倾斜\n```\n\nFile v1.0.0:references/ddl-design.md\n\n# DDL 设计规范\n\n## 表设计原则\n\n### 命名规范\n```\n表名：小写 + 下划线，加业务前缀\n  ods_orders          原始订单表\n  dwd_order_detail    订单明细事实表\n  dim_user            用户维度表\n  dws_user_daily      用户日汇总表\n  ads_funnel_report   漏斗报表\n\n列名：小写 + 下划线，语义清晰\n  user_id（不用 uid）\n  create_time（不用 ctime）\n  is_deleted（布尔用 is_ 前缀）\n  order_status（不用 status，加业务前缀）\n```\n\n### 字段类型选择\n\n```sql\n-- 整数：按范围选最小类型（节省存储，提升缓存命中）\nTINYINT     -- 1字节，-128~127，适合状态码、等级\nSMALLINT    -- 2字节，适合年份、小范围数值\nINT         -- 4字节，适合普通 ID（<21亿）\nBIGINT      -- 8字节，适合雪花ID、大流水号\n\n-- 字符串\nCHAR(n)     -- 定长，适合固定长度（手机号、身份证）\nVARCHAR(n)  -- 变长，适合普通文本，n 不要设太大（影响内存分配）\nTEXT        -- 大文本，不能建普通索引，不能作为主键\n\n-- 金额：绝对不用 FLOAT/DOUBLE（精度丢失）\nDECIMAL(10,2)   -- 精确小数，10位总长，2位小数\n-- 或者存分（整数），避免小数运算\nBIGINT          -- 单位：分，1元 = 100\n\n-- 时间\nDATETIME        -- MySQL，不含时区，'2024-01-15 10:30:00'\nTIMESTAMP       -- MySQL，含时区转换，范围到2038年（慎用）\nTIMESTAMPTZ     -- PostgreSQL，推荐，含时区\n\n-- 布尔\nTINYINT(1)      -- MySQL（没有原生 BOOLEAN）\nBOOLEAN         -- PostgreSQL\n```\n\n---\n\n## 生产级建表模板\n\n### 业务表（MySQL）\n```sql\nCREATE TABLE `orders` (\n    `id`            BIGINT          NOT NULL AUTO_INCREMENT  COMMENT '主键ID',\n    `order_no`      VARCHAR(32)     NOT NULL                 COMMENT '订单号（业务唯一标识）',\n    `user_id`       BIGINT          NOT NULL                 COMMENT '用户ID',\n    `product_id`    BIGINT          NOT NULL                 COMMENT '商品ID',\n    `quantity`      INT             NOT NULL DEFAULT 1       COMMENT '购买数量',\n    `unit_price`    DECIMAL(10,2)   NOT NULL                 COMMENT '单价（元）',\n    `discount`      DECIMAL(10,2)   NOT NULL DEFAULT 0.00    COMMENT '优惠金额（元）',\n    `actual_amount` DECIMAL(10,2)   NOT NULL                 COMMENT '实付金额（元）',\n    `status`        TINYINT         NOT NULL DEFAULT 0       COMMENT '订单状态：0待支付 1已支付 2已发货 3已完成 4已取消',\n    `remark`        VARCHAR(500)    DEFAULT NULL             COMMENT '备注',\n    `is_deleted`    TINYINT(1)      NOT NULL DEFAULT 0       COMMENT '软删除：0正常 1已删除',\n    `create_time`   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '创建时间',\n    `update_time`   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `uk_order_no` (`order_no`),\n    KEY `idx_user_id_status` (`user_id`, `status`),\n    KEY `idx_create_time` (`create_time`)\n) ENGINE=InnoDB\n  DEFAULT CHARSET=utf8mb4\n  COLLATE=utf8mb4_unicode_ci\n  COMMENT='订单表';\n```\n\n### 日志/流水表（大数据量）\n```sql\n-- 大流水表：分区 + 不建过多索引\nCREATE TABLE `user_behavior_logs` (\n    `id`            BIGINT          NOT NULL AUTO_INCREMENT  COMMENT '主键',\n    `user_id`       BIGINT          NOT NULL                 COMMENT '用户ID',\n    `event_type`    VARCHAR(50)     NOT NULL                 COMMENT '事件类型',\n    `event_data`    JSON            DEFAULT NULL             COMMENT '事件数据',\n    `ip`            VARCHAR(45)     DEFAULT NULL             COMMENT 'IP地址（支持IPv6）',\n    `user_agent`    VARCHAR(500)    DEFAULT NULL             COMMENT 'UA',\n    `create_time`   DATETIME(3)     NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间（毫秒精度）',\n    PRIMARY KEY (`id`, `create_time`),   -- 分区键必须在主键中\n    KEY `idx_user_event` (`user_id`, `event_type`, `create_time`)\n) ENGINE=InnoDB\n  DEFAULT CHARSET=utf8mb4\n  COMMENT='用户行为日志'\n  PARTITION BY RANGE (TO_DAYS(create_time)) (\n    PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),\n    PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')),\n    PARTITION p_future VALUES LESS THAN MAXVALUE\n  );\n```\n\n### 配置/字典表\n```sql\nCREATE TABLE `sys_config` (\n    `id`            INT             NOT NULL AUTO_INCREMENT  COMMENT '主键',\n    `config_key`    VARCHAR(100)    NOT NULL                 COMMENT '配置键',\n    `config_value`  TEXT            NOT NULL                 COMMENT '配置值',\n    `config_type`   VARCHAR(20)     NOT NULL DEFAULT 'string' COMMENT '值类型：string/int/json/boolean',\n    `description`   VARCHAR(500)    DEFAULT NULL             COMMENT '说明',\n    `is_enabled`    TINYINT(1)      NOT NULL DEFAULT 1       COMMENT '是否启用',\n    `create_time`   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `update_time`   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `uk_config_key` (`config_key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';\n```\n\n---\n\n## 在线 DDL 变更（生产安全）\n\n### MySQL 在线 DDL\n```sql\n-- 查看 DDL 是否支持 INPLACE（不锁表）\n-- Algorithm=INPLACE：不重建表，不锁表（最好）\n-- Algorithm=COPY：重建表，锁表（最差）\n\n-- 加列（MySQL 8.0 支持 INSTANT，瞬间完成）\nALTER TABLE orders\n    ADD COLUMN source VARCHAR(20) DEFAULT NULL COMMENT '来源渠道'\n    AFTER status,\n    ALGORITHM=INSTANT;  -- MySQL 8.0+\n\n-- 加索引（INPLACE，不锁表）\nALTER TABLE orders\n    ADD INDEX idx_product_id (product_id),\n    ALGORITHM=INPLACE,\n    LOCK=NONE;\n\n-- 修改列类型（通常需要 COPY，会锁表，用 pt-osc 代替）\n-- 生产环境用 pt-online-schema-change 或 gh-ost\n-- pt-osc: pt-online-schema-change --alter \"MODIFY COLUMN amount DECIMAL(12,2)\" D=db,t=orders\n\n-- 删除列（INPLACE）\nALTER TABLE orders\n    DROP COLUMN old_column,\n    ALGORITHM=INPLACE,\n    LOCK=NONE;\n```\n\n### 字符集迁移（utf8 → utf8mb4）\n```sql\n-- MySQL 的 utf8 实际上是 utf8mb3（不支持 emoji）\n-- 生产迁移步骤：\n\n-- 1. 修改数据库默认字符集\nALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\n-- 2. 修改表（在线 DDL）\nALTER TABLE orders\n    CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    ALGORITHM=INPLACE,\n    LOCK=NONE;\n\n-- 3. 修改连接字符集\nSET NAMES utf8mb4;\n-- 或在连接字符串中：charset=utf8mb4\n```\n\n---\n\n## 常见设计反模式\n\n```sql\n-- ❌ 反模式 1：用字符串存枚举值（无约束，难查询）\nstatus VARCHAR(20)  -- 'active', 'inactive', 'pending'...\n-- ✅ 用 TINYINT + 注释说明，或 ENUM（但 ENUM 修改成本高）\nstatus TINYINT COMMENT '1=active 2=inactive 3=pending'\n\n-- ❌ 反模式 2：用逗号分隔存多值\ntags VARCHAR(500)  -- '1,2,3,4'\n-- ✅ 单独建关联表\nCREATE TABLE user_tags (user_id BIGINT, tag_id INT, PRIMARY KEY(user_id, tag_id));\n\n-- ❌ 反模式 3：用 NULL 表示业务含义\ndiscount DECIMAL(10,2)  -- NULL 表示\"无折扣\"\n-- ✅ 用默认值 0，NULL 只表示\"未知/未填写\"\ndiscount DECIMAL(10,2) NOT NULL DEFAULT 0.00\n\n-- ❌ 反模式 4：主键用 UUID 字符串\nid VARCHAR(36) PRIMARY KEY  -- 'a1b2c3d4-...'\n-- ✅ 用 BIGINT 自增，或 BIGINT 雪花ID\nid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY\n\n-- ❌ 反模式 5：没有 create_time / update_time\n-- ✅ 所有业务表必须有这两个字段，便于排查问题和增量同步\n```\n\nFile v1.0.0:references/dialect-guide.md\n\n# 多方言差异速查\n\n## 方言对比矩阵\n\n| 功能 | MySQL | PostgreSQL | Hive | Spark SQL | ClickHouse |\n|------|-------|-----------|------|-----------|------------|\n| 字符串拼接 | `CONCAT(a,b)` | `a \\|\\| b` | `CONCAT(a,b)` | `CONCAT(a,b)` | `concat(a,b)` |\n| 日期格式化 | `DATE_FORMAT(d,'%Y-%m')` | `TO_CHAR(d,'YYYY-MM')` | `DATE_FORMAT(d,'yyyy-MM')` | `DATE_FORMAT(d,'yyyy-MM')` | `formatDateTime(d,'%Y-%m')` |\n| 当前时间 | `NOW()` | `NOW()` | `CURRENT_TIMESTAMP` | `CURRENT_TIMESTAMP` | `now()` |\n| 日期差 | `DATEDIFF(a,b)` | `a - b` | `DATEDIFF(a,b)` | `DATEDIFF(a,b)` | `dateDiff('day',b,a)` |\n| 字符串截取 | `SUBSTRING(s,1,3)` | `SUBSTRING(s,1,3)` | `SUBSTR(s,1,3)` | `SUBSTR(s,1,3)` | `substring(s,1,3)` |\n| 条件表达式 | `IF(cond,a,b)` | `CASE WHEN` | `IF(cond,a,b)` | `IF(cond,a,b)` | `if(cond,a,b)` |\n| 行号 | `ROW_NUMBER()` | `ROW_NUMBER()` | `ROW_NUMBER()` | `ROW_NUMBER()` | `row_number()` |\n| UPSERT | `ON DUPLICATE KEY` | `ON CONFLICT DO UPDATE` | 不支持 | 不支持 | `INSERT OR REPLACE` |\n| 递归 CTE | 8.0+ 支持 | 支持 | 不支持 | 支持 | 支持 |\n| JSON 支持 | 5.7+ | 原生 JSONB | 有限 | 有限 | 有限 |\n| 窗口函数 | 8.0+ | 完整支持 | 完整支持 | 完整支持 | 完整支持 |\n\n---\n\n## MySQL 特有语法\n\n```sql\n-- LIMIT 语法\nSELECT * FROM t LIMIT 10;           -- 前10行\nSELECT * FROM t LIMIT 10, 20;       -- 跳过10行，取20行（注意：偏移量在前）\nSELECT * FROM t LIMIT 20 OFFSET 10; -- 等价写法\n\n-- GROUP_CONCAT（行转列）\nSELECT user_id, GROUP_CONCAT(tag ORDER BY tag SEPARATOR ',') AS tags\nFROM user_tags GROUP BY user_id;\n\n-- ON DUPLICATE KEY UPDATE\nINSERT INTO counters (key, cnt) VALUES ('pv', 1)\nON DUPLICATE KEY UPDATE cnt = cnt + 1;\n\n-- 日期函数\nSELECT\n    DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'),  -- 格式化\n    DATE_ADD(NOW(), INTERVAL 7 DAY),           -- 加7天\n    DATE_SUB(NOW(), INTERVAL 1 MONTH),         -- 减1月\n    LAST_DAY(NOW()),                           -- 当月最后一天\n    WEEKDAY(NOW()),                            -- 星期几（0=周一）\n    QUARTER(NOW());                            -- 季度\n\n-- 字符串函数\nSELECT\n    FIND_IN_SET('b', 'a,b,c'),    -- 返回 2（位置）\n    FIELD('b', 'a', 'b', 'c'),    -- 返回 2（位置）\n    ELT(2, 'a', 'b', 'c');        -- 返回 'b'（按位置取值）\n```\n\n---\n\n## PostgreSQL 特有语法\n\n```sql\n-- RETURNING（返回被修改的行）\nINSERT INTO users (name) VALUES ('张三') RETURNING id, name;\nUPDATE orders SET status = 'paid' WHERE id = 1 RETURNING *;\nDELETE FROM logs WHERE id = 1 RETURNING *;\n\n-- 数组操作\nSELECT ARRAY[1,2,3];\nSELECT '{1,2,3}'::INT[];\nSELECT array_agg(id ORDER BY id) FROM users;  -- 聚合为数组\nSELECT unnest(ARRAY[1,2,3]);                  -- 展开数组为行\n\n-- JSONB 操作\nSELECT data->'name' AS name FROM users;           -- 取 JSON 字段（返回 JSON）\nSELECT data->>'name' AS name FROM users;          -- 取 JSON 字段（返回文本）\nSELECT data#>>'{address,city}' AS city FROM users; -- 嵌套路径\nUPDATE users SET data = data || '{\"vip\":true}';   -- 合并 JSON\nCREATE INDEX idx_json ON users USING GIN(data);   -- JSON 索引\n\n-- 窗口函数扩展\nSELECT\n    NTILE(4) OVER (ORDER BY amount) AS quartile,  -- 四分位\n    PERCENT_RANK() OVER (ORDER BY amount),         -- 百分比排名\n    CUME_DIST() OVER (ORDER BY amount)             -- 累积分布\nFROM orders;\n\n-- 物化视图\nCREATE MATERIALIZED VIEW mv_daily_stats AS\nSELECT DATE(create_time), COUNT(*), SUM(amount)\nFROM orders GROUP BY DATE(create_time);\n\nREFRESH MATERIALIZED VIEW CONCURRENTLY mv_daily_stats;  -- 不锁表刷新\n\n-- 分区表（声明式分区）\nCREATE TABLE orders (\n    id BIGSERIAL,\n    create_time TIMESTAMPTZ NOT NULL,\n    amount NUMERIC\n) PARTITION BY RANGE (create_time);\n\nCREATE TABLE orders_2024_01 PARTITION OF orders\nFOR VALUES FROM ('2024-01-01') TO ('2024-02-01');\n```\n\n---\n\n## Hive / Spark SQL 特有语法\n\n```sql\n-- 分区操作\nSHOW PARTITIONS table_name;\nALTER TABLE t ADD PARTITION (dt='2024-01-15');\nALTER TABLE t DROP PARTITION (dt='2024-01-01');\n\n-- 动态分区插入\nSET hive.exec.dynamic.partition = true;\nSET hive.exec.dynamic.partition.mode = nonstrict;\n\nINSERT OVERWRITE TABLE dwd_orders PARTITION (dt)\nSELECT *, DATE(create_time) AS dt FROM ods_orders;\n\n-- LATERAL VIEW（展开数组/Map）\nSELECT user_id, tag\nFROM user_tags\nLATERAL VIEW EXPLODE(tags_array) tmp AS tag;\n\n-- LATERAL VIEW OUTER（保留空数组的行）\nSELECT user_id, tag\nFROM user_tags\nLATERAL VIEW OUTER EXPLODE(tags_array) tmp AS tag;\n\n-- collect_set / collect_list（聚合为数组）\nSELECT user_id,\n    collect_set(tag)  AS unique_tags,   -- 去重\n    collect_list(tag) AS all_tags       -- 不去重\nFROM user_tags GROUP BY user_id;\n\n-- 窗口函数（Hive 特有）\nSELECT *,\n    FIRST_VALUE(amount) OVER (PARTITION BY user_id ORDER BY create_time) AS first_order_amount,\n    LAST_VALUE(amount)  OVER (PARTITION BY user_id ORDER BY create_time\n                              ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_order_amount\nFROM orders;\n\n-- Hive 性能配置\nSET hive.vectorized.execution.enabled = true;   -- 向量化执行\nSET hive.cbo.enable = true;                     -- 开启 CBO\nSET mapreduce.job.reduces = 200;                -- 设置 Reduce 数量\nSET hive.exec.parallel = true;                  -- 并行执行无依赖 Stage\n```\n\n---\n\n## ClickHouse 特有语法\n\n```sql\n-- 引擎选择（最重要的设计决策）\n-- MergeTree：最常用，支持排序键、分区\nCREATE TABLE orders (\n    order_id    UInt64,\n    user_id     UInt32,\n    amount      Float64,\n    create_time DateTime\n) ENGINE = MergeTree()\nPARTITION BY toYYYYMM(create_time)   -- 按月分区\nORDER BY (user_id, create_time)       -- 排序键（也是稀疏索引）\nTTL create_time + INTERVAL 1 YEAR;   -- 数据过期自动删除\n\n-- ReplacingMergeTree：去重（异步，不保证实时）\nENGINE = ReplacingMergeTree(version_col)\n\n-- AggregatingMergeTree：预聚合\nENGINE = AggregatingMergeTree()\n\n-- 物化视图（实时预聚合）\nCREATE MATERIALIZED VIEW mv_daily_orders\nENGINE = SummingMergeTree()\nPARTITION BY toYYYYMM(order_date)\nORDER BY (order_date, user_id)\nAS SELECT\n    toDate(create_time) AS order_date,\n    user_id,\n    count() AS order_cnt,\n    sum(amount) AS total_amount\nFROM orders\nGROUP BY order_date, user_id;\n\n-- 数组函数\nSELECT arrayJoin([1,2,3]);                    -- 展开数组\nSELECT groupArray(amount) FROM orders;         -- 聚合为数组\nSELECT arraySum([1,2,3]);                      -- 数组求和\nSELECT arrayFilter(x -> x > 10, [5,15,20]);   -- 数组过滤\n\n-- 近似计算（大数据量下极快）\nSELECT uniq(user_id) FROM orders;              -- 近似去重计数\nSELECT quantile(0.99)(amount) FROM orders;     -- 近似分位数\nSELECT topK(10)(product_id) FROM orders;       -- 近似 Top K\n```","readmeExcerpt":"Skill: SQL Database Toolkit Owner: moniq888 Summary: All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates. Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-04T01:51:27.323Z | user SQL Database Toolkit 1.0.0 - 首次统一发布：整合 sql-master、sql-dataviz、sql-report-generator 三大功能包 - 支持多种数据库（如 SQLite、MySQL、PostgreSQL 等）及本","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip install -r requirements.txt"},{"language":"python","snippet":"from unified_pipeline import analyze_file\n\n# 文件 → SQL → 图表 → 洞察 → 报告\nresult = analyze_file(\n    \"sales.csv\",\n    sql=\"SELECT region, SUM(sales) as total FROM data GROUP BY region\",\n    charts=[{\"type\":\"bar\",\"x\":\"region\",\"y\":\"total\",\"title\":\"区域销售\"}],\n    output=\"report.html\"\n)\nprint(result.log())"},{"language":"python","snippet":"from database_connector import DatabaseConnector\n\n# 连接 MySQL\nconn = DatabaseConnector(\n    dialect=\"mysql+pymysql\",\n    host=\"localhost\", port=3306,\n    username=\"root\", password=\"xxx\",\n    database=\"sales_db\"\n)\nresult = conn.execute(\"SELECT * FROM orders WHERE amount > 1000\")\nprint(result.df)"},{"language":"python","snippet":"from interactive_charts import InteractiveChartFactory\n\nfactory = InteractiveChartFactory(theme=\"powerbi\")\nhtml = factory.create_line({\n    \"categories\": [\"1月\",\"2月\",\"3月\"],\n    \"series\": [{\"name\":\"销售额\",\"data\":[100,120,150]}]\n})\nfactory.save_html(html, \"chart.html\")"},{"language":"python","snippet":"from ai_insights import quick_insights\n\nreport = quick_insights(df, date_col=\"date\", value_cols=[\"sales\",\"profit\"])\nfor insight in report.insights:\n    print(f\"{insight.title}: {insight.description}\")"},{"language":"python","snippet":"from unified_pipeline import UnifiedPipeline\n\n# 创建 Pipeline\np = UnifiedPipeline(\"销售分析\").set_theme(\"powerbi\")\n\n# 加载数据\np.from_file(\"sales.csv\")\n\n# SQL 查询\np.query(\"SELECT region, SUM(amount) as total FROM data GROUP BY region\")\n\n# 生成交互式图表\np.interactive_chart(\"bar\", x_col=\"region\", y_col=\"total\", title=\"区域销售\")\np.interactive_chart(\"pie\", x_col=\"region\", y_col=\"total\", title=\"区域占比\")\n\n# AI 洞察\np.insights(value_cols=[\"total\"])\n\n# 生成完整报告\np.report(title=\"销售分析报告\", output=\"report.html\")\n\n# 打印日志\nprint(p.log())"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"# SQL Database Toolkit\n\n_全链路 SQL 数据分析工具包：数据连接 → SQL 查询 → 数据可视化 → AI 洞察 → 报告生成_\n\n## 概述\n\nSQL Database Toolkit 是 sql-master、sql-dataviz、sql-report-generator 三大 Skill 的统一整合版本，提供端到端的 SQL 数据分析能力。\n\n**核心能力：**\n- **数据连接层**：支持 SQLite/MySQL/PostgreSQL/SQL Server/ClickHouse 等多种数据库，以及 CSV/Excel/JSON/Parquet 等本地文件格式\n- **SQL 查询执行**：自然语言转 SQL、SQL 执行与优化、查询结果分析\n- **数据可视化**：24+ 种静态图表（PNG base64）+ 12 种交互式图表（HTML），支持 Power BI 风格配色\n- **AI 洞察**：基于统计的自动异常检测、趋势分析、相关性分析、TOP N 排名等\n- **报告生成**：完整 HTML 报告、KPI 仪表盘、行业模板库（90+ 模板）\n\n## 触发条件\n\n当用户提及以下关键词时触发：\n- SQL 查询、执行、优化\n- 数据库连接（MySQL/PostgreSQL/SQLite 等）\n- 数据可视化、图表生成（折线图/柱状图/饼图/热力图等）\n- 报告生成、仪表盘、数据看板\n- 数据分析、洞察、异常检测\n- 文件数据处理（CSV/Excel 导入导出）\n\n## 安装依赖\n\n```bash\npip install -r requirements.txt\n```\n\n**核心依赖：**\n- pandas, numpy - 数据处理\n- sqlalchemy, pymysql, psycopg2-binary - 数据库连接\n- matplotlib, seaborn, plotly - 可视化\n- scipy - 统计分析\n- jinja2 - 模板引擎\n\n## 快速开始\n\n### 1. 一键端到端分析\n\n```python\nfrom unified_pipeline import analyze_file\n\n# 文件 → SQL → 图表 → 洞察 → 报告\nresult = analyze_file(\n    \"sales.csv\",\n    sql=\"SELECT region, SUM(sales) as total FROM data GROUP BY region\",\n    charts=[{\"type\":\"bar\",\"x\":\"region\",\"y\":\"total\",\"title\":\"区域销售\"}],\n    output=\"report.html\"\n)\nprint(result.log())\n```\n\n### 2. 数据库查询\n\n```python\nfrom database_connector import DatabaseConnector\n\n# 连接 MySQL\nconn = DatabaseConnector(\n    dialect=\"mysql+pymysql\",\n    host=\"localhost\", port=3306,\n    username=\"root\", password=\"xxx\",\n    database=\"sales_db\"\n)\nresult = conn.execute(\"SELECT * FROM orders WHERE amount > 1000\")\nprint(result.df)\n```\n\n### 3. 生成交互式图表\n\n```python\nfrom interactive_charts import InteractiveChartFactory\n\nfactory = InteractiveChartFactory(theme=\"powerbi\")\nhtml = factory.create_line({\n    \"categories\": [\"1月\",\"2月\",\"3月\"],\n    \"series\": [{\"name\":\"销售额\",\"data\":[100,120,150]}]\n})\nfactory.save_html(html, \"chart.html\")\n```\n\n### 4. AI 自动洞察\n\n```python\nfrom ai_insights import quick_insights\n\nreport = quick_insights(df, date_col=\"date\", value_cols=[\"sales\",\"profit\"])\nfor insight in report.insights:\n    print(f\"{insight.title}: {insight.description}\")\n```\n\n## 模块索引\n\n### 数据连接层\n\n| 模块 | 功能 |\n|------|------|\n| `database_connector.py` | 数据库连接（支持 6+ 种数据库） |\n| `file_connector.py` | 本地文件加载（CSV/Excel/JSON/Parquet 等） |\n| `pipeline.py` | SQL Pipeline 编排器 |\n\n### 可视化层\n\n| 模块 | 功能 |\n|------|------|\n| `charts.py` | 静态图表工厂（24+ 种图表，PNG base64） |\n| `interactive_charts.py` | 交互式图表工厂（12 种图表，HTML）+ DashboardBuilder |\n\n### 报告层\n\n| 模块 | 功能 |\n|------|------|\n| `ai_insights.py` | AI 自动洞察生成器 |\n| `dashboard_templates.py` | 行业看板模板库（90+ 模板） |\n| `report_generator.py` | 报告生成器（表格/矩阵/切片器） |\n\n### 统一入口\n\n| 模块 | 功能 |\n|------|------|\n| `unified_pipeline.py` | 端到端统一 Pipeline（推荐） |\n| `__init__.py` | 统一导出所有核心类 |\n\n## 使用示例\n\n### 示例 1：完整分析流程\n\n```python\nfrom unified_pipeline import UnifiedPipeline\n\n# 创建 Pipeline\np = UnifiedPipeline(\"销售分析\").set_theme(\"powerbi\")\n\n# 加载数据\np.from_file(\"sales.csv\")\n\n# SQL 查询\np.query(\"SELECT region, SUM(amount) as total FROM data GROUP BY region\")\n\n# 生成交互式图表\np.interactive_chart(\"bar\", x_col=\"region\", y_co"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76k6338wpqydkxgdztg6vb9x83hz20\",\n  \"slug\": \"sql-database-toolkit\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1775267487323\n}"},{"path":"references/bar-charts.md","content":"# 条形图 & 横向条形图\n\n适用场景：分类比较、排名展示。\n\n---\n\n## 纵向条形图（类别 ≤ 10）\n\n```python\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nplt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']\nplt.rcParams['axes.unicode_minus'] = False\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\nbars = ax.bar(df['category'], df['value'],\n              color='#3b82f6', width=0.6, edgecolor='white')\n\n# 柱顶标注数值\nfor bar in bars:\n    h = bar.get_height()\n    ax.text(bar.get_x() + bar.get_width()/2, h + max(df['value'])*0.01,\n            f'{h:,.0f}', ha='center', va='bottom', fontsize=10)\n\nax.set_title('各品类销售额', fontsize=15, fontweight='bold', pad=12)\nax.set_xlabel('品类')\nax.set_ylabel('销售额（万元）')\nax.set_ylim(0, max(df['value']) * 1.15)  # 留出标注空间\nax.grid(axis='y', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 横向条形图（排名 / 类别多 / 名称长）\n\n```python\n# 按值排序，最大值在顶部\ndf_sorted = df.sort_values('value', ascending=True)\n\nfig, ax = plt.subplots(figsize=(10, max(6, len(df_sorted) * 0.4)))\n\n# 高亮 Top 1\ncolors = ['#ef4444' if i == len(df_sorted)-1 else '#3b82f6'\n          for i in range(len(df_sorted))]\n\nbars = ax.barh(df_sorted['name'], df_sorted['value'],\n               color=colors, height=0.6)\n\n# 右侧标注数值\nfor bar in bars:\n    w = bar.get_width()\n    ax.text(w + max(df_sorted['value'])*0.01, bar.get_y() + bar.get_height()/2,\n            f'{w:,.0f}', va='center', fontsize=10)\n\nax.set_title('Top 用户消费排名', fontsize=15, fontweight='bold', pad=12)\nax.set_xlabel('消费金额（元）')\nax.set_xlim(0, max(df_sorted['value']) * 1.12)\nax.grid(axis='x', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('bar_horizontal.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 分组条形图（多系列对比）\n\n```python\n# df 列：month, group_a, group_b, group_c\ncategories = df['month'].tolist()\nx = np.arange(len(categories))\nwidth = 0.25\nPALETTE = ['#3b82f6', '#10b981', '#f59e0b']\n\nfig, ax = plt.subplots(figsize=(12, 6))\n\nfor i, (col, label) in enumerate([('group_a', 'PC端'), ('group_b', '移动端'), ('group_c', '小程序')]):\n    offset = (i - 1) * width\n    bars = ax.bar(x + offset, df[col], width, label=label,\n                  color=PALETTE[i], edgecolor='white')\n\nax.set_xticks(x)\nax.set_xticklabels(categories)\nax.legend()\nax.set_title('各渠道月度订单量对比', fontsize=15, fontweight='bold')\nax.grid(axis='y', alpha=0.3, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\nplt.tight_layout()\nplt.savefig('grouped_bar.png', dpi=150, bbox_inches='tight')\n```\n\n---\n\n## 堆叠条形图（占比构成）\n\n```python\nfig, ax = plt.subplots(figsize=(12, 6))\nPALETTE = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444']\n\nbottom = np.zeros(len(df))\nfor i, col in enumerate(['cat_a', 'cat_b', 'cat_c', 'cat_d']):\n    ax.bar(df['month'], df[col], bottom=bottom,\n           label=col, color=PALETTE[i], edgecolor='white', linewidth=0.5)\n    bottom += df[col].val"},{"path":"references/canvas-render.md","content":"# Canvas 内嵌渲染\n\n在对话中直接渲染图表，无需保存文件，用户即时看到结果。\n\n---\n\n## 什么时候用 Canvas 渲染\n\n- 用户想在对话里直接看图，不想保存文件\n- 快速验证图表效果\n- 演示/汇报场景，需要即时展示\n\n---\n\n## 使用方式\n\n通过 `canvas` 工具的 `eval` action 执行 JavaScript，渲染 Chart.js 图表。\n\n### 折线图示例\n\n```javascript\n// canvas eval 内容\nconst ctx = document.getElementById('chart').getContext('2d');\nnew Chart(ctx, {\n  type: 'line',\n  data: {\n    labels: ['1月', '2月', '3月', '4月', '5月', '6月'],\n    datasets: [{\n      label: '订单量',\n      data: [1200, 1900, 1500, 2100, 2400, 2800],\n      borderColor: '#3b82f6',\n      backgroundColor: 'rgba(59,130,246,0.1)',\n      borderWidth: 2,\n      fill: true,\n      tension: 0.4,\n      pointRadius: 4\n    }]\n  },\n  options: {\n    responsive: true,\n    plugins: {\n      title: { display: true, text: '月度订单量趋势', font: { size: 16 } },\n      legend: { position: 'top' }\n    },\n    scales: {\n      y: { beginAtZero: true, grid: { color: 'rgba(0,0,0,0.05)' } }\n    }\n  }\n});\n```\n\n### Canvas HTML 模板\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n  <style>\n    body { font-family: 'Microsoft YaHei', sans-serif; padding: 20px; background: #fff; }\n    .chart-container { max-width: 800px; margin: 0 auto; }\n  </style>\n</head>\n<body>\n  <div class=\"chart-container\">\n    <canvas id=\"chart\"></canvas>\n  </div>\n  <script>\n    // 在这里放图表代码\n  </script>\n</body>\n</html>\n```\n\n---\n\n## Chart.js 常用图表类型\n\n| type 值 | 图表类型 |\n|---------|---------|\n| `'line'` | 折线图 |\n| `'bar'` | 条形图（纵向） |\n| `'bar'` + `indexAxis: 'y'` | 横向条形图 |\n| `'pie'` | 饼图（慎用） |\n| `'doughnut'` | 环形图 |\n| `'scatter'` | 散点图 |\n| `'bubble'` | 气泡图 |\n| `'radar'` | 雷达图 |\n\n---\n\n## 多系列条形图示例\n\n```javascript\nnew Chart(ctx, {\n  type: 'bar',\n  data: {\n    labels: ['Q1', 'Q2', 'Q3', 'Q4'],\n    datasets: [\n      {\n        label: 'PC端',\n        data: [3200, 4100, 3800, 5200],\n        backgroundColor: '#3b82f6'\n      },\n      {\n        label: '移动端',\n        data: [5100, 6200, 7100, 8900],\n        backgroundColor: '#10b981'\n      }\n    ]\n  },\n  options: {\n    responsive: true,\n    plugins: {\n      title: { display: true, text: '各渠道季度订单量' }\n    },\n    scales: { y: { beginAtZero: true } }\n  }\n});\n```\n\n---\n\n## 注意事项\n\n- Canvas 渲染依赖网络加载 Chart.js CDN，离线环境需本地引入\n- 数据量大时（>1000 点），建议先聚合再渲染，避免卡顿\n- 中文字体在 Canvas 中需要系统已安装对应字体\n- 复杂统计图（箱线图、小提琴图）建议用 Python matplotlib 生成图片，再展示"},{"path":"references/chart-guidelines.md","content":"# 图表选型指南\n\n根据数据类型和报告目标选择最合适的图表。\n\n---\n\n## 核心原则\n\n**图表存在的意义是传达信息，不是展示数据。**\n\n选择图表前先问自己：\n1. 我想传达什么信息？\n2. 读者最关心什么？\n3. 这个图表能让读者快速理解吗？\n\n---\n\n## 决策矩阵\n\n### 按数据关系选图\n\n| 数据关系 | 推荐图表 | 适用场景 | 避免使用 |\n|---------|---------|---------|---------|\n| **时间趋势** | 折线图 | 销售趋势、用户增长 | 饼图、散点图 |\n| **分类比较** | 横向条形图 | 品类排名、区域对比 | 折线图（类别少时） |\n| **占比构成** | 堆叠条形图 | 渠道占比、成本构成 | 饼图（>5类时） |\n| **数值分布** | 直方图/箱线图 | 订单金额分布、薪资分布 | 条形图 |\n| **两变量关系** | 散点图 | 价格vs销量、投入vs产出 | 折线图 |\n| **流程转化** | 漏斗图 | 购买漏斗、招聘漏斗 | 条形图 |\n| **多维对比** | 热力图 | Cohort留存、相关性矩阵 | 多个折线图 |\n| **地理分布** | 地图 | 区域销售、用户分布 | 条形图 |\n| **进度达成** | 进度条/仪表盘 | 目标达成率、KPI进度 | 折线图 |\n| **单一指标** | 大数字卡片 | 总营收、总用户数 | 任何图表 |\n\n---\n\n## 报告类型 vs 图表组合\n\n### 周报/月报\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（4个核心指标）              │\n├─────────────────────────────────────┤\n│  折线图（趋势）+ 洞察文字             │\n├────────────────────┬────────────────┤\n│  横向条形图（排名） │  堆叠图（构成）  │\n├────────────────────┼────────────────┤\n│  漏斗图（转化）     │  表格（明细）    │\n└────────────────────┴────────────────┘\n```\n\n### 财务报表\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（收入/利润/成本/费用）      │\n├─────────────────────────────────────┤\n│  环形图（成本构成）                  │\n├────────────────────┬────────────────┤\n│  堆叠条形图（收入构成）│  折线图（趋势）│\n├────────────────────┴────────────────┤\n│  表格（明细科目）                    │\n└─────────────────────────────────────┘\n```\n\n### 漏斗报告\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（整体转化率/各阶段转化率）  │\n├─────────────────────────────────────┤\n│  漏斗图（全宽）                      │\n├────────────────────┬────────────────┤\n│  分组漏斗（渠道对比）│  条形图（流失原因）│\n├────────────────────┴────────────────┤\n│  洞察 + 优化建议                     │\n└─────────────────────────────────────┘\n```\n\n### 留存报告\n```\n┌─────────────────────────────────────┐\n│  KPI 卡片（次日留存/7日留存/30日留存）│\n├─────────────────────────────────────┤\n│  Cohort 热力图（全宽）               │\n├────────────────────┬────────────────┤\n│  折线图（留存曲线） │  条形图（渠道对比）│\n└────────────────────┴────────────────┘\n```\n\n---\n\n## 图表设计规范\n\n### 折线图\n```python\n# 最佳实践\nfig, ax = plt.subplots(figsize=(11, 4))\nax.plot(df['date'], df['value'], linewidth=2.2, color='#3b82f6')\nax.fill_between(df['date'], df['value'], alpha=0.1, color='#3b82f6')  # 填充区域\n\n# 7日均线\nma7 = df['value'].rolling(7).mean()\nax.plot(df['date'], ma7, linewidth=1.5, linestyle='--', color='#f59e0b')\n\n# 峰值标注\nmax_idx = df['value'].idxmax()\nax.annotate(f\"峰值 {df.loc[max_idx, 'value']:,}\",\n            xy=(df.loc[max_idx, 'date'], df.loc[max_idx, 'value']),\n            xytext=(5, 5), textcoords='offset points')\n\n# 设计规范\nax.grid(axis='y', alpha=0.2, linestyle='--')\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n```\n\n**何时使用：**\n- 数据点 > 10 个\n- 需要展示趋势\n- 需要比较多条线（≤5条）\n\n**避免：**\n- 数据点 < 5 个（用条形图）\n- 多条线交叉严重（分图展示）\n\n### 条形图\n```python\n# 横向条形图（推荐，适合类别名称较长）\ndf_sorted = df.sort_values('value', ascending=True)\nfig, ax = plt.subplots(figsize=(7, 5))\nbars = ax.barh(df_sorted['category'], df_sorted['value'],\n               color='#3b82f6', height=0.6)\n\n# 数值标注\nfor bar in bars:\n    width = bar.get_w"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates. Skill: SQL Database Toolkit Owner: moniq888 Summary: All-in-one SQL data analysis toolkit supporting database/file connection, SQL query, visualization, AI insights, and report/dashboard generation with templates. Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-04T01:51:27.323Z | user SQL Database Toolkit 1.0.0 - 首次统一发布：整合 sql-master、sql-dataviz、sql-report-generator 三大功能包 - 支持多种数据库（如 SQLite、MySQL、PostgreSQL 等）及本","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":972,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T01:05:03.856Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:53:16.726Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}