OCAML SQLite3 预准备语句

ocaml sqlite3 prepared statement

提问人:OrderAndChaos 提问时间:9/5/2023 最后编辑:jthulhuOrderAndChaos 更新时间:9/9/2023 访问量:44

问:

我在 ocaml 中有以下 sqlite3 插入,效果正常。

type article = { author : string; content: string }

let insert_article db (article: article) =
  let sql = Printf.sprintf "INSERT INTO blog (author, content) VALUES ('%s', '%s')" article.author article.content in
  match exec db sql with
  | Rc.OK -> ()
  | _ -> raise @@ Error "Failed to insert"

如何将其转换为使用预准备语句?

我尝试过这种事情,但是没有用于作者和内容参数的插槽,

let insert_article db (article: article) =
  let sql = prepare db "INSERT INTO blog (author, content) VALUES (?, ?)" article.author article.content in
  match exec db sql with
  | Rc.OK -> ()
  | _ -> raise @@ Error "Failed to insert"

我在这里对 API 类型文档没有多大意义:http://mmottl.github.io/sqlite3-ocaml/api/sqlite3/Sqlite3/index.html#prepared-statements

我是 OCaml 的新手,有点困惑。任何指导将不胜感激。

sqlite ocaml 准备语句

评论

0赞 glennsl 9/5/2023
看来你已经回答了自己的问题,现在只是在征求意见。您应该发布您的更新作为答案。如果有人认为可以做得更好,他们会发布自己的。然后投票将决定哪个是最好的。
0赞 OrderAndChaos 9/5/2023
@glennsl我不确定这是“唯一”的方式。但是,是的,公平点就可以了。
1赞 glennsl 9/5/2023
它不一定是“那个”方式,这就是为什么你可以有多个答案:)

答:

2赞 OrderAndChaos 9/5/2023 #1

我已经找到了如何在准备好的语句中绑定参数。

这看起来很冗长,但它仍然是进步。

let insert_article db (article : article) =
  let stmt = prepare db "INSERT INTO blog (author, content) VALUES (?, ?)" in
  let authorBind = bind stmt 1 @@ Data.TEXT article.author in
  let contentBind = bind stmt 2 @@ Data.TEXT article.content in
  match (authorBind, contentBind) with
  | Rc.OK, Rc.OK -> (
      match step stmt with 
      | Rc.DONE -> () 
      | _ -> failwith "Failed to insert"
    )
  | _ -> failwith "Failed to bind parameters to the SQL query"