我正在尝试编写一个只删除表的查询。
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语法。
谢谢你们!
答案 0 :(得分:4)
使用PG'OCaml的语法扩展时,无法构造query
。您必须提供文字字符串。这是获得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
当然,这不是一个强大的实现,不应该在生产代码中使用。它不处理错误,也不是异步的。