2012-05-31 11 views
0

Я ищу Arround для подготовленных заявлений в Jython с JDBC (zxJDBC)/SQLite. Все я нахожу примеры, как это (book, Jython documentation):JDBC в Jython, подготовленные заявления

qry = "select continent from country where name = ?" 
cursor.executemany(qry,['Austria']) 

Однако я всегда понимал, подготовленные заявления, как способ, чтобы позволить базы данных оптимизировать заявление, не зная значения, вставленные для заполнителей. Один затем получает дескриптор этого заявления которым был передан через оптимизатор и может выполнить это с различными значениями, экономя усилия по оптимизации запросов, таким образом, я хотел бы ожидать, что следующий подход лучше:

qry = cursor.prepare("SELECT * FROM `table` WHERE `field`=? AND `field2`=?") #usually mor complex queries 
qry.execute(cursor, ?, (val1, val2)??) #here is the problem 

, к сожалению, я могу Не найти примеры того, как использовать выполнение, и документация отсутствует.

PyStatement.execute(cursor, params, bindings) 

Не могли бы вы объяснить мне, что params для и если мое предположение, как использовать bindings правильно. Мое лучшее предположение для параметров было бы в том, что они являются первым параметром метода setInt -Method (или тому подобного) Javas Javascript, и это было бы удивительно. Я ожидал, что Jython будет более коротким, и для этого просто ожидать параметры в правильном (спереди назад) порядке.

Bonus: Есть ли способ оплаты? (Кроме подведении курсора)

+1

Не ответ (потому что я не знаю jython), но первый вызов, вероятно, просто подготавливает оператор, связывает параметры и выполняет запрос за один раз. подготовленные операторы не только выполняют несколько похожих запросов. Также полезно, чтобы драйвер правильно удалил параметры и предотвратил атаки SQL-инъекций. –

+0

не ответ, так как мне нужен второй случай (несколько раз тот же запрос), но проницательный, не менее – ted

ответ

1

Похоже, это расширение использует нормальный Python Database Specification v2

Для execute он говорит:

Ссылка на операцию будет сохраняться курсором. Если один и тот же рабочий объект снова передается, курсор может оптимизировать его поведение. Это наиболее эффективно для алгоритмов, где используется одна и та же операция, но разные параметры привязаны к ней (много раз).

И executemany он говорит:

Те же замечания, что и для .Execute() также применяются соответственно к этому методу.

Так что, если это драйвера на самом деле реализует эту предложенную семантику, то только проездом в той же строке в execute или executemany следует повторно использовать PreparedStatement, однако вы можете проверить выполнение (или попросить реализатор), чтобы быть уверенным

+0

очень информативный, я все еще надеюсь, что кто-то cna светит светом на использование подготовки, даже если он просто создает лямбда функция, которая связывает 'execute' Мне нравится выглядеть лучше, просто хранить объект в моем классе, а не строку – ted