c - 如何使用问号对 sqlite 查询进行字符串化以查看将以文本形式执行的查询?
问题描述
我有一个程序。该程序进行了大量的 sqlite 查询。它对它们进行了优化吗?方式即
UPDATE controls SET value = ? WHERE rowid = ?
我在找什么:如果有一些乳清可以评估/字符串化来自 sqlite3 的查询以进行调试。即我想看到上面已经执行的查询真的是:
UPDATE controls SET value = 108 WHERE rowid = 42
显然我可以自己写这个,但我认为我的愿望是“普遍的”,即我希望类似的东西应该已经存在。
解决方案
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
推荐阅读
- ruby - 无法为 docker ruby alpine 安装 openssl-dev
- c - 使用 fgets() 随机出现分段错误,仅发生在 linux 服务器上,而不是我自己的发行版
- python - Python Regex:如果包含某些字符串,则不匹配
- awk - 使用 awk 打印字段是否以特定字符串开头
- spring-boot - 为什么 Intellij 在 Spring Boot Starter 项目中无法识别 Gradle?
- swift - 初始化后将数据传递给 TabBarControllers?
- swift - 快照/观察者代码在 Firebase 中做了什么?
- python-3.x - 根据python3.x中的规则查找dict的交集
- css - css 一次过渡到多个元素
- python - 获取python中调用函数的源代码