2010-05-11 5 views

ответ

1

При создании подготовленного оператора SQL-код шаблона уже отправляется в СУБД, который скомпилирует его в дерево выражений. Когда вы передаете значения, соответствующая библиотека (модуль python sqlite3 в вашем случае) не объединяет значения в оператор. СУБД делает.

Если вы все еще хотите создать обычную строку SQL, вы можете использовать функции замены строк, чтобы заменить заполнители на значения (после их избежания).

Для чего вам это нужно?

+0

К сожалению, мне нужно сгенерировать SQL-совместимый SQL для передачи в другое приложение. Я надеялся использовать что-то вроде sqlite3 или sqlalchemy для выполнения всех экранов и т. Д. –

+0

В этом случае я думаю, что подход с экранированием и заменой строковыми операциями может быть подходящим. Является ли подготовленный оператор также создан для SQLite? Если нет, вам может понадобиться преобразовать некоторые выражения из диалекта другого DB на диалект SQLite. В Java hibernate предоставляет классы для генерирования выражений, специфичных для диалектов. Я не уверен, предоставит ли он функции «вырожденным» выражениям, специфичным для диалектов, для преобразования их в другой диалект, и я не знаю, как это реализовано в sqlalchemy. – chiccodoro

2

При выполнении подготовленного оператора не создается новый SQL. Идея подготовленных операторов состоит в том, что запрос SQL и его данные передаются отдельно (поэтому вам не нужно избегать каких-либо аргументов) - запрос, скорее всего, сохраняется только в оптимизированной форме после его подготовки.

+0

Ах! Спасибо. Я не знал, как это сработало. Имеет смысл :) –