LalitMaganti/syntaqlite
GitHub: LalitMaganti/syntaqlite
这是一个基于 SQLite 原生 Lemon 语法构建的解析器、格式化器和语言服务器,支持针对特定版本的 SQL 验证与离线架构检查。
Stars: 671 | Forks: 12
#
syntaqlite
SQLite SQL 的解析器、格式化程序、验证器和语言服务器,基于 SQLite 自有的语法和分词器构建。如果 SQLite 接受它,syntaqlite 就能解析它。如果 SQLite 拒绝它,syntaqlite 也会拒绝。
**[文档](https://docs.syntaqlite.com)** · **[在线演示](https://playground.syntaqlite.com)** · **[VS Code 扩展](https://marketplace.visualstudio.com/items?itemName=syntaqlite.syntaqlite)**
## 为什么选择 syntaqlite
大多数 SQLite 工具构建通用的 SQL 解析器,并将 SQLite 作为一个“变体”附加进来,使用手写的语法、基于正则表达式的分词器或语言的近似子集。这种方式会失败,因为 SQLite 具有深层语法覆盖面,通用解析器无法处理。
syntaqlite 使用 SQLite 自有的 [Lemon 生成的语法](https://www.sqlite.org/lemon.html) 和分词器,从 C 编译而来。该解析器不近似 SQLite;它_就是_ SQLite 的语法,被编译为可重用的库。
SQLite SQL 也不是一种固定的语言。它有 [22 个编译时标志](https://www.sqlite.org/compile.html) 改变解析器接受的语法,另有 12 个控制内置函数,并且语言在不同版本间演进。由于 SQLite 是嵌入式的,你不能假设每个人都使用最新版本(Android 15 随附 SQLite 3.44.3,落后最新版本七个主要版本)。syntaqlite 追踪所有这些:
```
syntaqlite --sqlite-version 3.32.0 validate \
-e "DELETE FROM users WHERE id = 1 RETURNING *;"
```
```
error: syntax error near 'RETURNING'
--> :1:32
|
1 | DELETE FROM users WHERE id = 1 RETURNING *;
| ^~~~~~~~~
```
`RETURNING` 是在 SQLite 3.35.0 中添加的;Android 13 仍然随附 SQLite 3.32.2。
我们已经针对来自 [SQLite 上游测试套件](https://sqlite.org/testing.html) 的约 39.6 万条语句进行了测试,解析接受度约为 99.7%。请参阅[详细比较](https://docs.syntaqlite.com/latest/reference/comparison/),了解 syntaqlite 与其他工具的对比情况。
## 功能特性
### 验证 ([文档](https://docs.syntaqlite.com/latest/concepts/validation/))
针对你的架构查找未知的表、列和函数,捕获与 `sqlite3_prepare` 相同的错误,而无需数据库。与 `sqlite3` 不同,syntaqlite 在一次遍历中发现**所有**错误:
```
CREATE TABLE orders (id, status, total, created_at);
WITH
monthly_stats(month, revenue, order_count) AS (
SELECT strftime('%Y-%m', o.created_at), SUM(o.total)
FROM orders o WHERE o.status = 'completed'
GROUP BY strftime('%Y-%m', o.created_at)
)
SELECT ms.month, ms.revenue, ms.order_count,
ROUDN(ms.revenue / ms.order_count, 2) AS avg_order
FROM monthly_stats ms;
```
**sqlite3** 在第一个错误处停止,完全忽略了函数拼写错误:
```
Error: in prepare, table monthly_stats has 2 values for 3 columns
```
**syntaqlite** 发现了 CTE 列数不匹配和 `ROUDN` 拼写错误,并提供了源位置和建议:
```
error: table 'monthly_stats' has 2 values for 3 columns
|
2 | monthly_stats(month, revenue,
| ^~~~~~~~~~~~~
warning: unknown function 'ROUDN'
|
14 | ROUDN(ms.revenue / ms.order_count,
| ^~~~~
= help: did you mean 'round'?
```
### 格式化 ([文档](https://docs.syntaqlite.com/latest/reference/cli/#fmt))
确定性格式化,可配置行宽、关键字大小写和缩进:
```
echo "select u.id,u.name, p.title from users u join posts p on u.id=p.user_id
where u.active=1 and p.published=true order by p.created_at desc limit 10" \
| syntaqlite fmt
```
```
SELECT u.id, u.name, p.title
FROM users u
JOIN posts p ON u.id = p.user_id
WHERE u.active = 1
AND p.published = true
ORDER BY p.created_at DESC
LIMIT 10;
```
### 版本和编译标志感知 ([文档](https://docs.syntaqlite.com/latest/guides/version-pinning/))
将解析器固定到特定的 SQLite 版本或启用[编译时标志](https://www.sqlite.org/compile.html) 以匹配你的确切构建:
```
# 拒绝你的目标 SQLite 版本不支持的语法
syntaqlite --sqlite-version 3.32.0 validate query.sql
# 启用来自编译时标志的可选语法
syntaqlite --sqlite-cflag SQLITE_ENABLE_MATH_FUNCTIONS validate query.sql
```
### 验证其他语言中的 SQL *(实验性)*
在大多数真实的代码库中,SQL 位于 Python 和 TypeScript 字符串中。syntaqlite 提取并验证它,处理插值占位符:
```
# app.py
def get_user_stats(user_id: int):
return conn.execute(
f"SELECT nme, ROUDN(score, 2) FROM users WHERE id = {user_id}"
)
```
```
syntaqlite validate --experimental-lang python app.py
```
```
warning: unknown function 'ROUDN'
--> app.py:3:23
|
3 | f"SELECT nme, ROUDN(score, 2) FROM users WHERE id = {user_id}"
| ^~~~~
= help: did you mean 'round'?
```
### 项目配置
在项目根目录中创建 `syntaqlite.toml` 以配置架构和格式化。LSP、CLI 和所有编辑器集成都会自动读取它:
```
# 将 SQL 文件映射到 schema DDL 文件以进行验证和补全。
[schemas]
"src/**/*.sql" = ["schema/main.sql", "schema/views.sql"]
"tests/**/*.sql" = ["schema/main.sql", "schema/test_fixtures.sql"]
"migrations/*.sql" = [] # no schema validation for migrations
# 不匹配上述任何 glob 的 SQL 文件的默认 schema。
# schema = ["schema.sql"]
# 格式化选项(均为可选,显示默认值)。
[format]
line-width = 80
indent-width = 2
keyword-case = "upper" # "upper" | "lower"
semicolons = true
```
配置文件通过从正在处理的文件开始向上遍历来发现,与 `rustfmt.toml` 或 `ruff.toml` 相同。CLI 标志会覆盖配置文件值。
### 编辑器集成 ([文档](https://docs.syntaqlite.com/latest/getting-started/vscode/))
完整的语言服务器,无需数据库连接。诊断、保存时格式化、补全和语义高亮。
**VS Code** — 从市场安装 [syntaqlite 扩展](https://marketplace.visualstudio.com/items?itemName=syntaqlite.syntaqlite)。
**[其他编辑器](https://docs.syntaqlite.com/latest/getting-started/other-editors/)** — 将你的 LSP 客户端指向:
```
syntaqlite lsp
```
**Claude Code** — `claude plugin install syntaqlite@lalitmaganti-plugins` ([文档](https://docs.syntaqlite.com/latest/getting-started/claude-code/))
### 解析 ([文档](https://docs.syntaqlite.com/latest/guides/parsing/))
完整的抽象语法树 (AST),包含 token、注释和空白字符的附表,用于代码生成、迁移工具或静态分析。
```
syntaqlite parse -e "SELECT 1 + 2"
```
## Web 在线演示
不想安装任何东西就能试用 syntaqlite?**[Web 在线演示](https://playground.syntaqlite.com)** 通过 WASM 完全在你的浏览器中运行。即时解析、格式化和验证 SQL。
## 安装 ([所有方法](https://docs.syntaqlite.com/latest/getting-started/cli/))
**下载并运行(所有平台,无需安装)**
```
curl -sSf https://raw.githubusercontent.com/LalitMaganti/syntaqlite/main/tools/syntaqlite | python3 - fmt -e "select 1"
```
首次运行时下载二进制文件,进行缓存,每周自动更新。
**mise**
```
mise use github:LalitMaganti/syntaqlite
```
**pip(所有平台,捆绑二进制文件)**
```
pip install syntaqlite
```
**Homebrew (macOS)**
```
brew install LalitMaganti/tap/syntaqlite
```
**Cargo**
```
cargo install syntaqlite-cli
```
## 用作库 ([文档](https://docs.syntaqlite.com/latest/integrating/))
**Rust** ([API 文档](https://docs.syntaqlite.com/latest/integrating/rust-api/))
```
[dependencies]
syntaqlite = { version = "0.3.1", features = ["fmt"] }
```
**Python** ([API 文档](https://docs.syntaqlite.com/latest/reference/python-api/))
```
pip install syntaqlite
```
**JavaScript / WASM** ([API 文档](https://docs.syntaqlite.com/latest/reference/js-api/))
```
npm install syntaqlite
```
**C** — 解析器、分词器、格式化程序和验证器都有 C API。请参阅 [C API 文档](https://docs.syntaqlite.com/latest/reference/c-api/)。
## 架构 ([文档](https://docs.syntaqlite.com/latest/contributing/architecture/))
解析器和分词器使用 C 编写,直接封装 SQLite 自有的语法。其他所有内容(格式化程序、验证器、LSP)均使用 Rust 编写,并提供 C 绑定。
这种分离是有意为之。C 解析器与 SQLite 本身一样可移植:它可以在数据库引擎、嵌入式系统或任何运行 SQLite 的地方运行。Rust 层在标准库和 crate 生态系统重要的开发者工具方面发展迅速。
## 从源代码构建
```
tools/install-build-deps
tools/cargo build
```
## 贡献
请参阅[贡献指南](https://docs.syntaqlite.com/latest/contributing/) 了解架构概述和测试说明。
## 许可证
Apache 2.0。SQLite 组件在 [SQLite blessing](https://www.sqlite.org/copyright.html) 下属于公共领域。详情请参阅 [LICENSE](
标签:AI工具, Android数据库, DNS解析, Lemon语法生成器, LSP, SQL, SQLite, SQL检查, SQL版本兼容性, SQL语法高亮, VSCode插件, 代码格式化, 可视化界面, 威胁情报, 开发者工具, 开源项目, 数据可视化, 数据库, 格式化工具, 系统审计, 编译原理, 解析器, 词法分析, 语法分析, 语法树, 语言服务器, 逆向工具, 通知系统, 验证器