#postgresql #parse-tree #sql-query #sql-parser #source #internal #return

pg_parse

使用实际 PostgreSQL 服务器源来解析 SQL 查询并返回内部 PostgreSQL 解析树的 PostgreSQL 解析器

6 个版本 (重大更改)

0.11.0 2023 年 7 月 27 日
0.10.0 2022 年 11 月 24 日
0.9.1 2022 年 6 月 7 日
0.8.0 2022 年 2 月 20 日
0.7.0 2022 年 1 月 20 日

#2271数据库接口

每月 30 次下载

MIT 许可证

17MB
333K SLoC

C 164K SLoC // 0.1% comments C++ 92K SLoC // 0.1% comments SQL 68K SLoC // 0.2% comments Rust 8K SLoC // 0.0% comments Ruby 1.5K SLoC // 0.0% comments

pg_parse   构建状态 最新版本 文档徽章

Rust 的 PostgreSQL 解析器,使用 实际的 PostgreSQL 服务器源 来解析 SQL 查询并返回内部 PostgreSQL 解析树。

入门

将以下内容添加到您的 Cargo.toml

[dependencies]
pg_parse = "0.11"

示例:解析查询

use pg_parse::ast::Node;

let result = pg_parse::parse("SELECT * FROM contacts");
assert!(result.is_ok());
let result = result.unwrap();
assert!(matches!(*&result[0], Node::SelectStmt(_)));

// We can also convert back to a string, if the `str` feature is enabled (enabled by default).
#[cfg(feature = "str")]
assert_eq!(result[0].to_string(), "SELECT * FROM contacts");

pg_parse 和 pg_query.rs 之间的区别是什么?

pganalyze 组织维护官方实现:pg_query.rs。这非常接近团队发布的 C 库的名称(libpg_query)。此实现使用 libpg_query 版本 13 引入的 protobuf 接口。

此库类似地消耗 libpg_query,但利用旧的 JSON 接口进行解析管理。此库的目的是保持一个依赖性“轻”实现,其中 serdeserde_json 是唯一的运行时依赖。

那么你应该使用哪一个?你可能想使用官方的 pg_query.rs 库,因为这个库将保持与 libpg_query 更新的紧密同步。此库将继续维护,但可能不如官方实现更新。

致谢

非常感谢 Lukas Fittl 为创建 libpg_query 所做的所有出色工作。

依赖