#sql-parser #abstract #sql #sql-query #query-parser #parser #query

ocarina

一个小型包,正在致力于抽象 SQL

1 个不稳定版本

0.1.0 2019年6月17日

#36 in #query-parser

Apache-2.0 协议

16KB
278 行(不含注释)

奥卡林娜

奥卡林娜是一个基本的 SQL 解析器,它将表达式 {keyword - data} 的执行抽象成一个易于理解的字符串,该字符串以后可以被其他程序用来执行查询。

它是面向项目的,因此编写方式使得它可以与其他项目结合使用。至少我尽量这样做。

阅读

奥卡林娜是一个 Rust 初学者项目,我想通过它来提高我的 Rust 编程能力和在 vim 中编辑代码的能力。因此,目前不应将其用于或与其他代码集成。

如果您有兴趣或时间参与该项目,请随时参与。我很喜欢贡献,如果您愿意,我很乐意与您合作。

结构

库的主要部分是一个解析器 {parser.rs},它结合了库的不同元素,并使用库的不同部分将初始查询转换为数据库需要执行的用户/系统请求查询的抽象表示。

状态

项目处于第一阶段,我在研究并尝试很多不同的事情,以便找到一个适合在 SQL 和应用程序之间使用的简单易用层。

工作

首先,系统必须为查询创建一个新的解析器。

let query = "SELECT * FROM users WHERE userID = 1";
let _parser = parser::Parser::new(query);

之后,解析器提供不同的方法来操作和更改查询,以及将其拆分成更易理解的格式,如令牌。目前,令牌只是一个被拆分为 vec 的空格分隔的单词。

为了获得输入查询的最终令牌,必须遵循以下流程

# This method splits the query into tokens that can be parsed in later steps.
parser.split_query();
# Iterating over the query tokens and finding the indexes of each keyword it can find.
parser.find_keywords();

在查询上执行这些操作后,您将获得类似以下内容

expressions = [

[
	keyword: "SELECT",
	data: "*",
],

[
	keyword: "FROM",
	data: "users",
],
[
	keyword: "WHERE",
	data: ["userID","=","1"],
],
]	 

在这个当前状态下,我们无法真正操作这些令牌/表达式。这是我在不久的将来要实现的任务,以创建一个可以将查询更好地拆分为可解析列表的系统。

奥卡林娜的最终目标是创建一个查询解析器,该解析器可以用于数据库或其他类型的系统,用户可以通过 SQL 语法插入命令。

但奥卡林娜输出的主要解释目前不是我的兴趣所在,这需要由适配器或系统实现者来实现。

无运行时依赖