在SurrealDB的CONTENT语句中能否使用time::now()函数?
问题解答
在使用SurrealDB的CONTENT语句时,直接通过字符串传递time::now()会被当作字面量存储,原因是CONTENT会将传入的变量值原样解析。要让函数执行而非存字符串,有两种可行方案:
方案1:拆分CREATE语句,单独指定函数字段
不要完全依赖CONTENT传递所有字段,把需要执行函数的字段在SQL语句中直接声明:
CREATE stuff SET name = $data.name, created_at = time::now();
对应的Rust代码调整为只传递需要的字面量字段:
fn stuff_here(media: NewMedia) -> BTreeMap<String, Value> { let data: BTreeMap<String, Value> = [ ("name".to_string(), media.name.into()), ].into(); let vars: BTreeMap<String, Value> = [("data".into(), data.into())].into(); vars }
方案2:使用SurrealDB Rust客户端的Function Value变体
SurrealDB的Value枚举提供了Function变体,可以直接构建函数调用,让数据库识别并执行它。修改Rust代码如下:
use surrealdb::sql::Value; fn stuff_here(media: NewMedia) -> BTreeMap<String, Value> { let data: BTreeMap<String, Value> = [ ("name".to_string(), media.name.into()), ("created_at".to_string(), Value::Function("time::now".to_string(), vec![])), ].into(); let vars: BTreeMap<String, Value> = [("data".into(), data.into())].into(); vars }
这样传递给CONTENT的created_at会被识别为函数调用,插入时自动执行time::now()获取当前时间。
内容的提问来源于stack exchange,提问作者Peter I
相关产品推荐
相关产品推荐

