Skip to main content

Module queryable

Module queryable 

Source
Expand description

derive(Queryable) — 从 SELECT 结果自动派生结构体(Diesel 风格)

Diesel 通过 #[derive(Queryable)] 让结构体自动从 SQL 行反序列化。 SZ-ORM 在 Value 之上提供类似的 trait + 派生辅助。

由于 proc-macro derive 需要在 sz-orm-macros 包中实现, 此模块提供 trait 定义和运行时反序列化逻辑; 派生宏 #[derive(Queryable)]sz-orm-macros 中实现。

§设计

  • Queryable trait:从 Vec<Value> 按列顺序填充结构体字段
  • FromRow trait:从 HashMap<String, Value> 按列名填充(更鲁棒)
  • RowDesc:行描述(列名 + 列数),用于反序列化校验

§用法

use sz_orm_core::value::Value;
use sz_orm_core::queryable::{Queryable, FromRow, RowDesc};

#[derive(Debug, Default, PartialEq)]
struct UserRow {
    id: i64,
    name: String,
}

impl Queryable for UserRow {
    fn from_values(values: Vec<Value>) -> Result<Self, QueryError> {
        if values.len() != 2 {
            return Err(QueryError::ColumnCountMismatch {
                expected: 2,
                actual: values.len(),
            });
        }
        let id = values[0].as_i64().ok_or(QueryError::TypeMismatch {
            column: 0,
            expected: "i64",
        })?;
        let name = values[1].as_str().ok_or(QueryError::TypeMismatch {
            column: 1,
            expected: "String",
        })?.to_string();
        Ok(UserRow { id, name })
    }
}

let row = UserRow::from_values(vec![Value::I64(42), Value::String("Alice".into())]).unwrap();
assert_eq!(row.id, 42);
assert_eq!(row.name, "Alice");

Structs§

RowDesc
行描述:列名 + 列数

Enums§

QueryError
反序列化错误

Traits§

FromRow
HashMap<String, Value> 按列名反序列化(更鲁棒)
Queryable
Vec<Value> 按列顺序反序列化(Diesel 风格)

Functions§

value_as_bool
提取 bool
value_as_f64
提取 f64
value_as_i64
提取 i64(支持 I8/I16/I32/I64/U8/U16/U32/U64/F32/F64/Bool/String 转换)
value_as_nullable_i64
提取 Option<i64>(Null 返回 None)
value_as_nullable_string
提取 Option<String>(Null 返回 None)
value_as_string
提取 String