erlang-sqlite3 sqlite3:table_info 错误
Posted
技术标签:
【中文标题】erlang-sqlite3 sqlite3:table_info 错误【英文标题】:erlang-sqlite3 sqlite3:table_info error 【发布时间】: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 无论如何都注定要失败。
【参考方案1】:
我有fixed the problem 和INTEGER PRIMARY KEY
。 default
更难支持,但我添加了一个后备,至少它不会崩溃。正如@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') 函数。以上是关于erlang-sqlite3 sqlite3:table_info 错误的主要内容,如果未能解决你的问题,请参考以下文章
计算(1/2+1/3+...+1/20)+(2/3+2/4+...+2/20)+(3/4+3/5+...+3/20)+...+(18/19+18/20)+19/20等于多少