erlang-sqlite3 sqlite3:table_info 错误

erlang-sqlite3 sqlite3:table_info error

我尝试使用 sqlite3:table_info/2 函数从 sqlite 数据库中提取 table 信息,但收到一条错误消息。

{ok,Pid} = sqlite3:open(db3).

Sql = <<"CREATE TABLE test (
           id INTEGER PRIMARY KEY,
           ts TEXT default (datetime('now')),
           key TEXT,
           val TEXT
           );">>.
sqlite3:sql_exec(db3,Sql).

检查table列表:

sqlite3:list_tables(db3).
[test]

尝试获取 table 信息:

sqlite3:table_info(db3,test). 

现在错误信息:


    `=错误报告==== 1-Mar-2015::19:37:46 ===
    ** 通用服务器 db3 终止
    ** 最后一条消息是 {table_info,test}
    ** 当服务器状态 == {state,#Port,
                                   [{文件,"../tmp/db3.sqlite"}],
                                   {dict,0,16,16,8,80,48,
                                         {[],[],[],[],[],[],[],[],[],[],[],[],[],
                                          [],[],[]},
                                         {{[],[],[],[],[],[],[],[],[],[],[],[],[],
                                           [],[],[]}}}}
    ** 终止原因 ==
    ** {function_clause,[{sqlite3,build_constraints,
                                  [["INTEGER","PRIMARY","KEY"]],
                                  [{文件,"src/sqlite3.erl"},{行,1169}]},
                         {sqlite3,build_table_info,2,
                                  [{文件,"src/sqlite3.erl"},{行,1166}]},
                         {sqlite3,handle_call,3,
                                  [{文件,"src/sqlite3.erl"},{行,833}]},
                         {gen_server,try_handle_call,4,
                                     [{文件,"gen_server.erl"},{行,607}]},
                         {gen_server,handle_msg,5,
                                     [{文件,"gen_server.erl"},{行,639}]},
                         {proc_lib,init_p_do_apply,3,
                                   [{文件,"proc_lib.erl"},{行,237}]}]}
    ** 异常退出:function_clause
         在函数 sqlite3:build_constraints/1
            称为 sqlite3:build_constraints(["INTEGER","PRIMARY","KEY"])
         来自 sqlite3:build_table_info/2 的调用(src/sqlite3.erl,第 1166 行)
         来自 sqlite3 的调用:handle_call/3(src/sqlite3.erl,第 833 行)
         来自 gen_server:try_handle_call/4 的调用(gen_server.erl,第 607 行)
         来自 gen_server:handle_msg/5 的调用(gen_server.erl,第 639 行)
         来自 proc_lib:init_p_do_apply/3 的调用(proc_lib.erl,第 237 行)

有什么想法吗?

fixed the problemINTEGER PRIMARY KEYdefault 更难支持,但我添加了一个回退,至少它不会崩溃。正如@CL 所提到的,这种解析无论如何都是不可靠的(因为不幸的是 SQLite 没有公开任何使用它自己的解析器的方法)。