如何准备来自 CLI 解释器的语句?

dot*_*hen 5 sqlite prepared-statement command-line-interface

如何从 SQLite CLI 准备语句?我找到了编译 SQL 语句页面,但它更适合 ODBC 接口,而不是 CLI 解释器。我正在寻找类似于以下内容的东西:

sqlite> pq = prepare(SELECT * FROM Users WHERE username=?)
sqlite> run(pq, 'jeffatwood')
0 | jeffatwood | hunter2 | admin
sqlite> 
Run Code Online (Sandbox Code Playgroud)

SQLite CLI 是否有任何此类功能?请注意,我指的不是 Bash CLI,而是 SQLite 的 CLI 解释器。

Din*_*rus 7

也许使用命名参数的SQL 参数可以解决问题

sqlite> .param set :user 'jeffatwood'
sqlite> select * from Users where username = :user
Run Code Online (Sandbox Code Playgroud)

应该返回所需的行。


LS_*_*ᴅᴇᴠ 0

CLI 并不是为此而设计的。为此,您必须在可用的编程语言上使用 SQLite API。

您还可以编写批处理/shell 文件来处理 CLI 调用。

例如,在 Windows 中,文件名称User.bat如下:

@SQLITE3.EXE some.db "SELECT * FROM Users WHERE username='%~1'"
Run Code Online (Sandbox Code Playgroud)

可以这样称呼:

User "jeffatwood"
Run Code Online (Sandbox Code Playgroud)

将执行所需的结果。

编辑:

关于准备/编译的语句:使用这些语句,您可以绑定参数、逐行获取查询并以更快的方式重复相同的命令。

sqlite3 CLI 工具不会利用这些优势:

  • 所有参数都必须在SQL语句中输入,使得绑定失去作用;
  • 一次性返回所有查询行,无需逐行获取;
  • 重复的命令必须重新输入 - 小的速度改进将导致使用预编译语句。

  • @LS_ᴅᴇᴠ“你不能从这里的准备好的语句中获得任何好处”这是错误的,准备好的语句消除了转义的需要并防止 SQL 注入。您的批处理脚本容易受到 SQL 注入的影响。 (4认同)
  • 谢谢。请注意,您的批处理文件示例是错误的,它确实_不_使用准备好的语句。 (3认同)