1

我正在尝试编写一个简单地删除表的查询。

  let drop_table dbh table_name =
    let query = String.concat " " ["drop table"; table_name] in
    PGSQL(dbh) query

我从查询中收到以下错误

File "save.ml", line 37, characters 10-11:
Parse error: STRING _ expected after ")" (in [expr])
File "save.ml", line 1:
Error: Preprocessor error

为什么我会收到此错误?看来此函数是有效的 Ocaml 语法。

多谢你们!

4

1 回答 1

4

query使用 PG'OCaml 的语法扩展时不能构造。您必须提供文字字符串。这是获得 PG'Ocaml 的编译时查询验证的权衡。如果query可以是任何 OCaml 表达式,PG'OCaml 将不知道如何在编译时验证它。

就个人而言,我已经完全停止使用语法扩展。我的感觉是它不适用于大型项目。相反,我prepare直接打电话execute。例如,这个函数将创建一个新的数据库连接(假设连接参数是先前定义的),运行给定的查询,并关闭连接:

let exec query =
  let db = PGOCaml.connect ~host ~user ~database ~port ~password ()  
  PGOCaml.prepare db ~query ();  
  let ans = PGOCaml.execute db ~params:[] () in  
  PGOCaml.close db;  
  ans

当然,这不是一个健壮的实现,不应该在生产代码中使用。它不处理错误并且不是异步的。

于 2013-08-13T15:09:51.197 回答