JDBC в Jython, подготовленные операторы

Я ищу подготовленные операторы в Jython с JDBC (zxJDBC) / SQLite. Все, что я нахожу, - это такие примеры (книга, документация 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

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

PyStatement.execute(cursor, params, bindings)

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

Бонус: есть ли способ освободить набор результатов? (Помимо закрытия курсора)


person ted    schedule 31.05.2012    source источник
comment
Не ответ (потому что я не знаю jython), но первый вызов, вероятно, просто подготавливает оператор, связывает параметры и выполняет запрос за один раз. Подготовленные операторы предназначены не только для выполнения нескольких похожих запросов. Также полезно заставить драйвер правильно экранировать параметры и предотвратить атаки SQL-инъекций.   -  person JB Nizet    schedule 31.05.2012
comment
не ответ, так как мне нужен второй случай (несколько раз один и тот же запрос), но все же проницательный   -  person ted    schedule 31.05.2012


Ответы (1)


Похоже, это расширение использует обычную Спецификацию базы данных Python v2

Для execute сказано:

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

А для executemany написано:

К этому методу применимы те же комментарии, что и для .execute ().

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

person Mark Rotteveel    schedule 31.05.2012
comment
очень информативно, я все же надеюсь, что кто-то сможет пролить свет на использование подготовки, даже если он просто создает лямбда-функцию, которая связывает execute Мне нравится, что лучше просто сохранить объект в моем классе, а не строку - person ted; 31.05.2012