如何检查SQLite3语法?

6
有没有一种方法可以在不运行它的情况下检查SQLite3脚本的语法?
基本上,我正在寻找SQLite3等价物:ruby -c script.rbperl -c script.plphp --syntax-check script.php等。
我考虑过使用explain,但是我想要检查的大多数脚本都是为了参考而保留的(并且不一定有相关联的数据库)。使用explain也会使其难以与Syntastic之类的东西一起使用。 (也就是说,我只想检查语法,而不是语义。)
更新:
我很困惑。 假设我想要语法检查这个:
select * from foo;

我可以做类似这样的事情:
echo 'explain select * from foo;' | sqlite3

但是我得到:

SQL error near line 1: no such table: foo

我希望看到的只是“语法正确”(或类似的内容)。这可能吗?

这很接近我所想的:http://developer.mimer.se/validator/parser200x/index.tml#parser - Benjamin Oakes
该链接已失效。原帖中的问题似乎很重要,因为SQLite不会向用户报告许多类型的错误。例如,拼写错误的PRAGMA会被简单地忽略,这在我看来是疯狂的。 - Jeffrey Benjamin Brown
3个回答

2
迄今为止,对我而言工作良好的语法检查器是 Ruby gem sqlint
它检查 ANSI SQL:不特定于 sqlite 方言。 它在问题提出 5 年后的 2015 年发布。 它需要 Ruby 和 C 编译器(来构建 pg_query 原生扩展)。
以下是一个输出示例: $ sqlint ex7a.sql ex7a.sql:81:10:ERROR syntax error at or near "*" 按照真正的 Unix 传统,如果语法正确,sqlint 就不会产生任何输出。正如提问者所问,它不会检查表是否存在。

谢谢分享!几周前我就知道了 sqlint,但是你的回答让我真正安装并尝试了它。 - Benjamin Oakes

1

正如您所提到的,您可以使用EXPLAIN关键字。它将返回有关语句如何执行的信息,如果您省略了前面的EXPLAIN关键字。


0

你可以在内存数据库上使用EXPLAIN。使用sqlite3,你可以通过将“:memory:”作为文件名传递给sqlite3_open_v2()来获取一个内存数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接