首页 > 解决方案 > 如何使用问号对 sqlite 查询进行字符串化以查看将以文本形式执行的查询?

问题描述

我有一个程序。该程序进行了大量的 sqlite 查询。它对它们进行了优化吗?方式即

UPDATE controls SET value = ? WHERE rowid = ?

我在找什么:如果有一些乳清可以评估/字符串化来自 sqlite3 的查询以进行调试。即我想看到上面已经执行的查询真的是:

UPDATE controls SET value = 108 WHERE rowid = 42

显然我可以自己写这个,但我认为我的愿望是“普遍的”,即我希望类似的东西应该已经存在。

标签: csqlite

解决方案


sqlite 提供了一个功能,正是提供了这一点。可以在文档中找到更多信息:

字符 *sqlite3_expanded_sql(sqlite3_stmt *pStmt);

sqlite3_expanded_sql(P) 接口返回一个指向 UTF-8 字符串的指针,该字符串包含扩展绑定参数的准备语句 P 的 SQL 文本。

...

另一方面,由 sqlite3_expanded_sql(P) 返回的字符串是从 sqlite3_malloc() 获得的,并且必须由应用程序通过将其传递给 sqlite3_free() 来释放。

https://www.sqlite.org/c3ref/expanded_sql.html

实际上,如果您将 sqlite3_expanded_sql 的调用放在绑定参数和执行更新之间,那么:

sqlite3_bind_int(stmt, 1, 108);
sqlite3_bind_int(stmt, 2, 42);

char *expanded = sqlite3_expanded_sql(stmt);
printf("expanded: %s\n", expanded);
sqlite3_free(expanded);

rc = sqlite3_step(stmt);

然后调试控制台上的输出是:

expanded: UPDATE controls SET value = 108 WHERE rowid = 42

推荐阅读