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插件, 代码格式化, 可视化界面, 威胁情报, 开发者工具, 开源项目, 数据可视化, 数据库, 格式化工具, 系统审计, 编译原理, 解析器, 词法分析, 语法分析, 语法树, 语言服务器, 逆向工具, 通知系统, 验证器