Expand description
derive(Queryable) — 从 SELECT 结果自动派生结构体(Diesel 风格)
Diesel 通过 #[derive(Queryable)] 让结构体自动从 SQL 行反序列化。
SZ-ORM 在 crate::value::Value 之上提供类似的 trait + 派生辅助。
由于 proc-macro derive 需要在 sz-orm-macros 包中实现,
此模块提供 trait 定义和运行时反序列化逻辑;
派生宏 #[derive(Queryable)] 在 sz-orm-macros 中实现。
§设计
Queryabletrait:从Vec<Value>按列顺序填充结构体字段FromRowtrait:从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§
- Query
Error - 反序列化错误
Traits§
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