DB Explorer
连接数据库,运行查询,探索模式,并导出数据 —— 所有这些都可以从终端完成。
何时使用
当用户:
说“检查数据库”,“查询DB”,“显示数据”
想要查看表结构,行数或样本数据
需要将数据导出为CSV/JSON
想要查找慢速查询或检查DB健康状态
提到数据库连接字符串或DB名称
支持的数据库
数据库 CLI 工具 安装(macOS) 安装(Linux)
PostgreSQL psql brew install postgresql apt install postgresql-client
MySQL mysql brew install mysql apt install mysql-client
SQLite sqlite3 (macOS自带) apt install sqlite3
MongoDB mongosh brew install mongosh 参见mongodb.com/docs/shell
Redis redis-cli brew install redis apt install redis-tools
快速入门
询问用户:
数据库类型(postgres/mysql/sqlite/mongo/redis)
连接字符串 或 主机/端口/数据库/用户/密码
对于SQLite:仅文件路径
# PostgreSQL
psql "postgresql://用户:密码@主机:5432/数据库名" -c "\dt" # 列出表
psql "postgresql://用户:密码@主机:5432/数据库名" -c "\d 表名" # 描述表
psql "postgresql://用户:密码@主机:5432/数据库名" -c "SELECT count(
) FROM 表名;" # 计数
# MySQL
mysql -h 主机 -u 用户 -p 数据库名 -e "SHOW TABLES;"
mysql -h 主机 -u 用户 -p 数据库名 -e "DESCRIBE 表名;"
mysql -h 主机 -u 用户 -p 数据库名 -e "SELECT count() FROM 表名;"
# SQLite
sqlite3 /path/to/db.db ".tables" # 列出表
sqlite3 /path/to/db.db ".schema 表名" # 描述表
sqlite3 /path/to/db.db "SELECT count(
) FROM 表名;" # 计数
# MongoDB
mongosh "mongodb://用户:密码@主机:27017/数据库名" --eval "db.getCollectionNames()"
mongosh "mongodb://用户:密码@主机:27017/数据库名" --eval "db.集合名.countDocuments()"
# Redis
redis-cli -h 主机 -p 6379 -a 密码 INFO keyspace
redis-cli -h 主机 -p 6379 -a 密码 DBSIZE
redis-cli -h 主机 -p 6379 -a 密码 KEYS ""
始终遵循以下规则:
默认只读 —— 不要在没有用户明确确认的情况下运行INSERT/UPDATE/DELETE/DROP
限制结果 —— 总是将LIMIT 100(或等效)添加到SELECT查询中,除非用户要求所有结果
显示前执行 —— 对于任何写操作,显示确切的SQL/命令并要求确认
不在历史记录中显示密码 —— 使用环境变量或连接字符串,不要回显密码
事务安全 —— 对于写操作,先用BEGIN/ROLLBACK包装,显示结果,然后要求COMMIT
当用户说“探索数据库”或“显示模式”时:
# 步骤1:列出所有表
# 步骤2:对于每个表,显示列,类型和约束
# 步骤3:显示行数
# 步骤4:显示外键关系
# 步骤5:总结为可读的模式地图
PostgreSQL完整模式转储:
psql "$CONN" -c " SELECT table_name, column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = 'public' ORDER BY table_name, ordinal_position; "
MySQL完整模式转储:
mysql "$CONN" -e " SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME, ORDINAL_POSITION; "
将查询结果导出为常见格式:
# CSV(PostgreSQL)
psql "$CONN" -c "\copy (SELECT
FROM 表名) TO '/tmp/export.csv' WITH CSV HEADER"
# CSV(MySQL)
mysql "$CONN" -e "SELECT FROM 表名" | sed 's/\t/,/g' > /tmp/export.csv
# JSON(PostgreSQL)
psql "$CONN" -t -c "SELECT json_agg(t) FROM (SELECT
FROM 表名 LIMIT 100) t;" > /tmp/export.json
# SQLite导出为CSV
sqlite3 /path/to/db.db ".mode csv" ".headers on" ".output /tmp/export.csv" "SELECT FROM 表名;" ".quit"
-- PostgreSQL:表大小
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- PostgreSQL:活动连接
SELECT pid, usename, application_name, client_addr, state, query_start, query FROM pg_stat_activity WHERE state != 'idle';
-- PostgreSQL:慢速查询(> 1s)
SELECT pid, now() - pg_stat_activity.query_start AS duration, query FROM pg_stat_activity WHERE state = 'active' AND now() - pg_stat_activity.query_start > interval '1 second';
-- MySQL:表大小
SELECT table_name, ROUND(data_length/1024/1024, 2) AS data_mb, table_rows FROM information_schema.tables WHERE table_schema = DATABASE() ORDER BY data_length DESC;
-- MySQL:进程列表
SHOW FULL PROCESSLIST;
性能分析
PostgreSQL性能
# 慢速查询(活动时间 > 1s)
psql "$CONN" -c " SELECT pid, now() - query_start AS duration, query FROM pg_stat_activity WHERE state = 'active' AND now() - query_start > interval '1 second' ORDER BY duration DESC; "
# 索引使用情况
psql "$CONN" -c " SELECT schemaname, tablename, indexname, idx_scan