🔄 卡若AI 重建本地主仓 | 保留有效小文件
This commit is contained in:
63
01_卡资(金)/金仓_存储备份/Navicat_Premium_静默控制/Navicat_功能与静默命令对照表.md
Normal file
63
01_卡资(金)/金仓_存储备份/Navicat_Premium_静默控制/Navicat_功能与静默命令对照表.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# Navicat 功能与静默命令对照表
|
||||
|
||||
> 不打开 Navicat,用系统自带或常用 CLI 实现相同能力。卡若AI 执行「数据库备份/查询/导入导出」时优先用本表命令。
|
||||
|
||||
---
|
||||
|
||||
## MySQL / MariaDB
|
||||
|
||||
| Navicat 功能 | 静默命令 / 方式 |
|
||||
|------------------|-----------------|
|
||||
| 连接并执行 SQL | `mysql -h HOST -P PORT -u USER -p DBNAME -e "SELECT ..."` 或 `mysql ... < script.sql` |
|
||||
| 备份整个库 | `mysqldump -h HOST -P PORT -u USER -p DBNAME > backup.sql` |
|
||||
| 仅表结构 | `mysqldump --no-data ...` |
|
||||
| 恢复 | `mysql -h HOST -P PORT -u USER -p DBNAME < backup.sql` |
|
||||
| 导出为 CSV | `mysql ... -e "SELECT ..." \| sed 's/\t/,/g' > out.csv` 或脚本用 pymysql + csv |
|
||||
|
||||
---
|
||||
|
||||
## MongoDB
|
||||
|
||||
| Navicat 功能 | 静默命令 / 方式 |
|
||||
|------------------|-----------------|
|
||||
| 连接并执行 | `mongosh "mongodb://USER:PASS@HOST:PORT/DB" --eval "db.collection.find()"` |
|
||||
| 备份(dump) | `mongodump --uri="mongodb://..." --out=/path/to/dump` |
|
||||
| 恢复 | `mongorestore --uri="mongodb://..." /path/to/dump` |
|
||||
| 导出集合为 JSON | `mongoexport --uri="..." -c COLLECTION -o out.json` |
|
||||
| 导出为 CSV | `mongoexport ... --type=csv -f "field1,field2" -o out.csv` |
|
||||
|
||||
---
|
||||
|
||||
## PostgreSQL
|
||||
|
||||
| Navicat 功能 | 静默命令 / 方式 |
|
||||
|------------------|-----------------|
|
||||
| 连接并执行 SQL | `psql -h HOST -p PORT -U USER -d DBNAME -c "SELECT ..."` 或 `psql ... -f script.sql` |
|
||||
| 备份 | `pg_dump -h HOST -p PORT -U USER DBNAME > backup.sql` |
|
||||
| 恢复 | `psql -h HOST -p PORT -U USER -d DBNAME -f backup.sql` |
|
||||
|
||||
---
|
||||
|
||||
## SQLite
|
||||
|
||||
| Navicat 功能 | 静默命令 / 方式 |
|
||||
|------------------|-----------------|
|
||||
| 连接并执行 | `sqlite3 /path/to/db.sqlite "SELECT ..."` 或 `sqlite3 db.sqlite < script.sql` |
|
||||
| 备份 | `cp db.sqlite backup.sqlite` 或 `sqlite3 db.sqlite ".backup backup.sqlite"` |
|
||||
| 导出为 CSV | `sqlite3 -header -csv db.sqlite "SELECT * FROM t" > out.csv` |
|
||||
|
||||
---
|
||||
|
||||
## 本机约定(卡若AI)
|
||||
|
||||
- **MongoDB**:本机统一 `localhost:27017`,库名见 `运营中枢/工作台/本机数据库统一规则.md`(如 `karuo_site`)。
|
||||
- **MySQL**:本机/腾讯云等见同目录上级 `数据库管理/SKILL.md` 与《00_账号与API索引》中的连接信息;脚本中勿写死密码,用环境变量或《00》中约定方式。
|
||||
|
||||
---
|
||||
|
||||
## 版本记录
|
||||
|
||||
| 日期 | 变更 |
|
||||
|------------|------|
|
||||
| 2026-03-19 | 初版:MySQL/MongoDB/PostgreSQL/SQLite 静默命令对照。 |
|
||||
| 2026-03-19 | 迁至金仓 Navicat_Premium_静默控制 目录。 |
|
||||
94
01_卡资(金)/金仓_存储备份/Navicat_Premium_静默控制/README.md
Normal file
94
01_卡资(金)/金仓_存储备份/Navicat_Premium_静默控制/README.md
Normal file
@@ -0,0 +1,94 @@
|
||||
# Navicat Premium 静默控制方案
|
||||
|
||||
> **目标**:不打开 Navicat GUI,用命令行/脚本完成「Navicat 能做的」数据库操作,供卡若AI 与自动化流程调用。
|
||||
> 维护:金仓;归属:金仓_存储备份。
|
||||
|
||||
---
|
||||
|
||||
## 一、Navicat 官方 CLI 能力分析
|
||||
|
||||
### 1.1 官方「命令行」是什么
|
||||
|
||||
- Navicat 文档里的「命令行界面」指**软件内部的**「命令行工具」窗口:需先**打开 Navicat**,在界面里选择「命令行工具」再执行 SQL。
|
||||
- **结论**:官方没有提供「不启动 GUI、纯命令行」的独立 CLI;所有「用命令连接/用命令备份」都是在**已打开软件**的前提下,在 GUI 内操作。
|
||||
|
||||
### 1.2 平台差异
|
||||
|
||||
| 平台 | 命令行能力 |
|
||||
|--------|------------|
|
||||
| Windows | 部分版本支持 `Navicat.exe /backup MySQL ConnectionName` 等参数,可做备份等;文档不完整。 |
|
||||
| macOS | **未提供**等价命令行参数;无独立可执行 CLI,无法静默调起备份/导出。 |
|
||||
|
||||
### 1.3 若必须用 Navicat 本身
|
||||
|
||||
- **AppleScript / JXA**:可控制已运行的 Navicat(菜单、按钮、窗口),但会带出界面,无法做到「完全静默、不打开 APP」。
|
||||
- **URL Scheme**:未在公开文档中看到 Navicat 注册 `navicat://` 等 URL Scheme;若需可自行查 `Info.plist` 的 `CFBundleURLTypes`。
|
||||
|
||||
---
|
||||
|
||||
## 二、静默控制思路(不打开 APP)
|
||||
|
||||
核心思路:**用各数据库原生 CLI 替代 Navicat 的查询/备份/导入导出**,实现「静默、脚本化」;Navicat 仅作「连接配置的参考来源」。
|
||||
|
||||
| Navicat 功能 | 静默实现方式 |
|
||||
|------------------|--------------|
|
||||
| 连接 MySQL | `mysql` / `mysqldump`(或 Python `pymysql`) |
|
||||
| 连接 MongoDB | `mongosh` / `mongodump` / `mongoexport` |
|
||||
| 连接 PostgreSQL | `psql` / `pg_dump` |
|
||||
| 连接 SQLite | `sqlite3` |
|
||||
| 备份/导出 | `mysqldump`、`mongodump`、`pg_dump`、复制 db 文件 |
|
||||
| 导入/恢复 | `mysql < file.sql`、`mongorestore`、`psql -f` |
|
||||
| 执行 SQL/查询 | 上述 CLI 或各语言驱动直接执行 |
|
||||
| 数据传输/同步 | 需自行用脚本(导出→导入)或 ETL 工具;无 Navicat 时无法用其「数据传输」向导 |
|
||||
|
||||
连接信息从哪来:**从 Navicat 的配置里读**(见下一节),再传给上述 CLI/脚本。
|
||||
|
||||
---
|
||||
|
||||
## 三、Navicat 配置位置(macOS)
|
||||
|
||||
- **连接等配置**:`~/Library/Preferences/com.premiumSoft.NavicatPremium.plist`
|
||||
或版本/产品线不同可能为:`com.premiumSoft.Navicat*` 系列 plist。
|
||||
- 可用 `plutil -p ~/Library/Preferences/com.premiumSoft.NavicatPremium.plist` 查看结构;连接多为键值或嵌套字典(主机、端口、用户等),密码可能加密存储。
|
||||
|
||||
---
|
||||
|
||||
## 四、实现要点
|
||||
|
||||
### 4.1 本目录内容
|
||||
|
||||
1. **静默命令对照表**
|
||||
见同目录 `Navicat_功能与静默命令对照表.md`,按「Navicat 功能 → 对应命令行」列表,便于卡若AI 或人工替换。
|
||||
|
||||
2. **从 Navicat 配置读连接信息(可选)**
|
||||
脚本:`scripts/read_navicat_connections.py`:
|
||||
- 读 `~/Library/Preferences/com.premiumSoft.NavicatPremium.plist`;
|
||||
- 解析出连接名、主机、端口、用户、数据库名(密码若加密则需另填或钥匙串);
|
||||
- 输出为 JSON,供 `mysql`/`mongosh`/`psql` 等命令使用。
|
||||
这样「不打开 APP」也能复用你在 Navicat 里配好的连接名与主机/端口/库名。
|
||||
|
||||
3. **与现有技能联动**
|
||||
- 数据库管理(金仓):备份、清理、维护脚本已用 `mysql`/`mongosh` 等,与本方案一致;需要时可直接引用「静默命令对照表」与「读 Navicat 连接」脚本。
|
||||
- 本机数据库统一规则、唯一 MongoDB 约定:脚本输出的连接信息需符合现有「本机一个实例、按库名区分」等约定。
|
||||
|
||||
### 4.2 无法静默替代的部分
|
||||
|
||||
- **Navicat 独有功能**:如「数据传输」向导、部分可视化同步、报表等,无官方 CLI 时无法在不打开 APP 的前提下完全等价实现;只能通过「导出→脚本处理→导入」或其它工具链替代。
|
||||
|
||||
---
|
||||
|
||||
## 五、使用方式(卡若AI)
|
||||
|
||||
- 用户说「用命令行备份某库」「不打开 Navicat 执行某 SQL」等:
|
||||
走**数据库管理** Skill,按「静默命令对照表」用 `mysqldump`/`mongosh`/`mysql` 等执行;若需用 Navicat 里已保存的连接,可先跑 `scripts/read_navicat_connections.py` 取连接参数再调用原生 CLI。
|
||||
- 用户说「静默控制 Navicat」「不打开 Navicat 做 xxx」:
|
||||
优先解释「官方无静默 CLI」,并给出「用原生 CLI + 本方案」的等价做法与文档链接(本目录 README + 对照表)。
|
||||
|
||||
---
|
||||
|
||||
## 六、版本记录
|
||||
|
||||
| 日期 | 变更 |
|
||||
|------------|------|
|
||||
| 2026-03-19 | 初版:Navicat CLI 分析、静默思路、配置路径、实现要点与使用方式。 |
|
||||
| 2026-03-19 | 以原程序名命名,迁至金仓_存储备份下,移除「卡罗帮」称谓。 |
|
||||
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
从 Navicat Premium (macOS) 的 plist 中读取连接配置(主机、端口、用户、库名等)。
|
||||
密码通常为加密存储,需在《00_账号与API索引》或环境变量中另行配置。
|
||||
用途:不打开 Navicat,用 mysql/mongosh/psql 等 CLI 时复用连接信息。
|
||||
归属:金仓 · Navicat Premium 静默控制。
|
||||
"""
|
||||
import json
|
||||
import plistlib
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PLIST_PATH = Path.home() / "Library/Preferences/com.premiumSoft.NavicatPremium.plist"
|
||||
# 其他可能路径
|
||||
ALT_PATHS = [
|
||||
Path.home() / "Library/Application Support/PremiumSoft CyberTech/Navicat Premium/",
|
||||
]
|
||||
|
||||
|
||||
def load_plist(path: Path) -> dict:
|
||||
try:
|
||||
with open(path, "rb") as f:
|
||||
return plistlib.load(f)
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
|
||||
def extract_connections(data: dict) -> list:
|
||||
"""从 plist 结构中尽量解析出连接信息(结构因版本可能不同)。"""
|
||||
out = []
|
||||
# 常见键名(不同版本可能不同)
|
||||
for key in ("connections", "Connection", "Servers", "favoriteConnections", "connectionList"):
|
||||
if key in data and isinstance(data[key], (list, dict)):
|
||||
raw = data[key]
|
||||
items = raw if isinstance(raw, list) else list(raw.values()) if isinstance(raw, dict) else []
|
||||
for item in items:
|
||||
if isinstance(item, dict):
|
||||
conn = {
|
||||
"name": item.get("name") or item.get("connectionName") or item.get("label") or "unknown",
|
||||
"host": item.get("host") or item.get("Host") or "",
|
||||
"port": item.get("port") or item.get("Port") or 0,
|
||||
"user": item.get("userName") or item.get("user") or item.get("UserName") or "",
|
||||
"database": item.get("database") or item.get("databaseName") or "",
|
||||
"type": item.get("type") or item.get("databaseType") or "",
|
||||
}
|
||||
if conn["host"] or conn["database"] or conn["user"]:
|
||||
out.append(conn)
|
||||
# 若顶层是列表或字典,尝试遍历
|
||||
if not out and isinstance(data, dict):
|
||||
for k, v in data.items():
|
||||
if isinstance(v, dict) and any(x in v for x in ("host", "Host", "userName", "user")):
|
||||
conn = {
|
||||
"name": v.get("name") or v.get("connectionName") or k,
|
||||
"host": v.get("host") or v.get("Host") or "",
|
||||
"port": v.get("port") or v.get("Port") or 0,
|
||||
"user": v.get("userName") or v.get("user") or "",
|
||||
"database": v.get("database") or v.get("databaseName") or "",
|
||||
"type": v.get("type") or v.get("databaseType") or "",
|
||||
}
|
||||
if conn["host"] or conn["database"] or conn["user"]:
|
||||
out.append(conn)
|
||||
return out
|
||||
|
||||
|
||||
def main():
|
||||
path = PLIST_PATH
|
||||
if not path.exists():
|
||||
for p in ALT_PATHS:
|
||||
candidate = p / "preferences.plist" if p.is_dir() else p
|
||||
if candidate.exists():
|
||||
path = candidate
|
||||
break
|
||||
if not path.exists():
|
||||
print(json.dumps({"error": "Navicat plist not found", "tried": str(PLIST_PATH)}, ensure_ascii=False, indent=2))
|
||||
sys.exit(1)
|
||||
data = load_plist(path)
|
||||
connections = extract_connections(data)
|
||||
if not connections:
|
||||
# 输出原始键,便于调试
|
||||
print(json.dumps({"keys": list(data.keys())[:50], "message": "No connection structure found"}, ensure_ascii=False, indent=2))
|
||||
sys.exit(0)
|
||||
print(json.dumps(connections, ensure_ascii=False, indent=2))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user