1 个不稳定版本
0.1.0 | 2019年6月17日 |
---|
#36 in #query-parser
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 语法插入命令。
但奥卡林娜输出的主要解释目前不是我的兴趣所在,这需要由适配器或系统实现者来实现。