Как структурировать SQL-запрос с вопросительными знаками, чтобы увидеть запрос, который будет выполнен в текстовой форме? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть программа. Программа делает много sqlite запросов. И это делает их оптимизированными? то есть

UPDATE controls SET value = ? WHERE rowid = ?

То, что я ищу: если есть какая-нибудь сыворотка для оценки / перевода запроса из sqlite3 обратно в целях отладки. Т.е. я хотел бы видеть, что на самом деле запрос выше, который был выполнен, выглядит так:

UPDATE controls SET value = 108 WHERE rowid = 42

Очевидно, я могу написать это сам, но я думаю, что мое желание "общее", то есть я ожидал чего-то подобного должно быть уже там.

1 Ответ

1 голос
/ 29 марта 2020

sqlite предлагает функцию, которая обеспечивает именно это. Дополнительную информацию об этом можно найти в документации:

char * sqlite3_expanded_ sql (sqlite3_stmt * pStmt);

Интерфейс sqlite3_expanded_ sql (P) возвращает указатель в строку UTF-8, содержащую SQL текст подготовленного оператора P с расширенными связанными параметрами.

...

Строка, возвращаемая sqlite3_expanded_ sql (P), с другой стороны, получается из sqlite3_mallo c () и должна быть свободной приложением путем передачи это в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...