【问题标题】:erlang-sqlite3 sqlite3:table_info errorerlang-sqlite3 sqlite3:table_info 错误
【发布时间】:2015-05-02 01:53:47
【问题描述】:

我尝试使用 sqlite3:table_info/2 函数从 sqlite 数据库中提取表信息并收到错误消息。

{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).

查看表格列表:

sqlite3:list_tables(db3).
[test]

尝试获取表信息:

sqlite3:table_info(db3,test). 

现在错误信息:

`=错误报告==== 2015 年 3 月 1 日::19:37:46 === ** 通用服务器 db3 终止 ** 最后一条消息是 {table_info,test} ** 当服务器状态 == {state,#Port, [{文件,"../tmp/db3.sqlite"}], {dict,0,16,16,8,80,48, {[],[],[],[],[],[],[],[],[],[],[],[],[], [],[],[]}, {{[],[],[],[],[],[],[],[],[],[],[],[],[], [],[],[]}}}} ** 终止原因 == ** {function_clause,[{sqlite3,build_constraints, [["整数","主","键"]], [{file,"src/sqlite3.erl"},{line,1169}]}, {sqlite3,build_table_info,2, [{file,"src/sqlite3.erl"},{line,1166}]}, {sqlite3,handle_call,3, [{file,"src/sqlite3.erl"},{line,833}]}, {gen_server,try_handle_call,4, [{file,"gen_server.erl"},{line,607}]}, {gen_server,handle_msg,5, [{file,"gen_server.erl"},{line,639}]}, {proc_lib,init_p_do_apply,3, [{file,"proc_lib.erl"},{line,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 行)

有什么想法吗?

【问题讨论】:

  • 这看起来像是sqlite3.erl 中的一个错误(INTEGER 不是约束)。无论如何,尝试解析 SQL 无论如何都注定要失败。

标签: sqlite erlang


【解决方案1】:

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

【讨论】:

  • 谢谢。 sqlite3 命令行工具有一个命令 .schema ?TABLE?显示表的创建语句。有可能有这样的东西吗?我的建议是,在大多数情况下,用户希望查看表格的结构以了解如何使用它。
  • 我们试图解析的就是 create 语句。如果需要,只需 sql_exec "select sql from sqlite_master where tbl_name = 'whatever_name' and type='table';"
  • 另一种可能性是将raw 选项添加到sqlite3:table_info,它不解析任何内容,只返回语句。
  • 看起来是个好主意。我在创建表脚本中发现了一个错误:它应该是 datetime('now') 函数。
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2012-09-09
  • 2015-07-18
  • 2011-06-14
  • 2015-06-11
相关资源
最近更新 更多