「这是我参与11月更文挑战的第 14 天,活动详情查看:2021最后一次更文挑战」
SQL模块
到这正式进入sql模块。不过这实际与之前的 meta command
模块没有什么不同,至少在结构上是这样。我们有一个枚举,定义了我们最初计划支持的查询类型。然后是一个带有 fn new()
的 impl block,同样作为构造函数。
然后是一个 fn process_command()
,返回 Result<String, SQLRiteError>
,如果你还记得,这个函数是由 main.rs 调用的。在这个函数中,神奇的事情开始发生。
你会注意到,在 fn process_command()
的开头,我们使用了 sqlparser-rs crate
,它为Rust建立了一个可扩展的SQL Lexer和解析器,并有许多不同的SQL方言,包括SQLite方言,所以我决定暂时使用它们而不是编写一个全新的SQL Lexer。
通过调用 Parser::parse_sql()
,我得到了一个 Result<Vec<Statement>, ParserError>
,我做了一些基本的检查,并把它传递给一个匹配语句,以确定输入的是哪种类型的SQL语句,或者在这个过程中是否有错误,如果有,我就返回这个错误。返回的语句是 sqlparser::ast::Statement,它是一个所有可能语句结果的枚举,你可以从 sqlparser文档 中看到。
目前,我实际建立的解析器的唯一SQL语句是 CREATE TABLE
,对于其余的语句,我们只是识别SQL语句的类型并返回给用户。在与CREATE TABLE匹配的block中,我们调用另一个模块 Parser::create
,它包含了CREATE TABLE的所有逻辑。
1 | rust复制代码#[derive(Debug,PartialEq)] |
这是我们的 sql::parser::create
模块。
这里我们有两个结构类型的定义。第一个是 ParsedColumn
:代表表中的一个列,第二个是 CreateQuery
:代表一个表。正如你所看到的,CreateQuery有一个名为columns的属性,这是一个ParsedColumns的集合。我们在这个模块上的主要方法,也就是 fn new()
,返回一个 Result<CreateTable, SQLRiteError>
,然后将其插入到我们的数据库数据结构中,该结构仍有待于在代码中定义。
1 | rust复制代码// Represents Columns in a table |
本文转载自: 掘金