06|get hands dirty:SQL查询工具怎么一鱼多吃?

213 阅读2分钟

正式开始

本节代码

宏编程

宏编程主要的工作就是把一棵语法树转换成另一颗语法树

一句话总结:宏编程的主要流程就是实现若干 From和 TryFrom

简单步骤

  1. 用 cargo new 库名 --lib 生成一个库
  2. cargo run --example 样例名字

给其他语言使用

  1. 创建一个 workspace
  2. 编辑Cargo.toml,添加workspace和memebers

Python

  1. 在workspace下使用 cargo new queryer-py --lib ,生成一个新的 crate

  2. 编辑它的Cargo.toml,如下

    [package]
    name = "queryer_py" # Python 模块需要用下划线
    version = "0.1.0"
    edition = "2021"
    
    [lib]
    crate-type = ["cdylib"] # 使用 cdylib 类型
    
    [dependencies]
    queryer = { path = "../queryer" } # 引入 queryer
    tokio = { version = "1", features = ["full"] }
    
    [dependencies.pyo3] # 引入 pyo3
    version = "0.14"
    features = ["extension-module"]
    
    [build-dependencies]
    pyo3-build-config = "0.14"
    
  3. 在 src/lib.rs中使用 #[pyfunction]声明方法,使用#[pymodule]声明模块,并把声明的方法添加进去

  4. queryer-py 目录下,创建 virtual env,然后用 maturin develop 构建 python 模块

    python3 -m venv .env
    source .env/bin/activate
    pip install maturin ipython
    maturin develop
    

小节

新鲜知识点

格林斯潘第十定律

任何 C 或 Fortran 程序复杂到一定程度之后,都会包含一个临时开发的、不合规范的、充满程序错误的、运行速度很慢的、只有一半功能的 Common Lisp 实现。

Parser_combinator 概念

Parsing_expression_grammar 概念

控制反转 概念

WAL 概念

关注点分离 概念(控制软件复杂度的法宝)

数据的解构也可以在分支上进行

Deref 和 DerefMut trait 允许类型在解引用时,可以解引用到其它类型

Trait 和实现 Trait 的 Struct 只要其中一个是自己定义的就可以避免孤儿规则

常用库推荐

Combinator解析器 nom

解析器 Serde

解析器 pest

sql解析器 sqlparser

处理DataFrame polars

Python下处理DataFrame Pandas

Rust和Python交互的库 pyo3

Rust和Node交互的库 neon

Rust和多平台的交互库 uniffi

跨平台框架 Tauri