OCaml中的Sqlite

3
如果有什么不清楚的,请问我,我会解释。我的目标是使用OCaml制作后端,开始“认真玩”这种语言。我选择做后端项目是因为我也想用React制作前端来提高我的React技能(我出于兴趣使用OCaml,出于工作需要使用React,我是一名Web开发人员)。我选择sqlite(使用此库:http://mmottl.github.io/sqlite3-ocaml/api/Sqlite3.html)作为数据库,以避免配置数据库。我有一个想法,制作一个简单的数据库调用包装器(因此,如果我决定更改数据库类型,只需更改它),并创建如下所示的函数:
val exec_query : query -> 'a List Deferred.t = <fun>

但是在库中,我看到了exec函数的签名:
val exec : db -> ?cb:(row -> headers -> unit) -> string -> Rc.t = <fun>

结果逐行传递给回调函数,但是为了我的目的,我认为我需要一些对象(列表、数组等),但我不知道如何从这个函数中创建它。

有人能建议我该怎么做吗?


嗨,@SHI1485。你的问题很好并且表达清晰,没有理由对你的英语能力或这个问题的相关性保持谦虚。在这种情况下,介绍(你提出这个问题的动机)是不必要的。 - sshine
1个回答

4

我猜您想要val exec_query: query -> row List Deferred.t 。由于Sqlite3不知道Async,您需要在单独的系统线程中执行返回行列表的调用。使用函数In_thread.run:(unit->'a)->'aDeferred.t(从签名中删除了可选参数)即可实现。因此,您需要编写以下内容(未经测试):

let exec_query db query =
  let rows_of_query () =
    let rows = ref [] in
    let rc = Sqlite3.exec_no_headers db query
                ~cb:(fun r -> rows := r :: !rows) in
    (* Note: you want to use result to handle errors *)
    !rows in
  In_thread.run rows_of_query

或者他可以将 rows_of_query 作为在回调中保存结果的示例。 - RichN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接