我正在寻找使用 JDBC ( zxJDBC )/ SQLite在 Jython 中准备好的语句。 我找到的只是这样的例子(book,Jython documentation):
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
的猜测是否正确。我对params的最佳猜测是,它们是来自Javas JDBC的setInt
- Method(或类似)的第一个参数,这样做会相当令人惊讶。我期望Jython更加简短,并且只是期望参数在右边(从前到后)顺序。
奖金:有没有办法释放结果集? (除了关闭光标)
答案 0 :(得分:1)
此扩展名看起来像普通的Python Database Specification v2
对于execute
,它说:
光标将保留对操作的引用。如果再次传入相同的操作对象,则游标可以优化其行为。这对于使用相同操作的算法最有效,但不同的参数被绑定(多次)。
对于executemany
,它说:
与.execute()相同的注释也适用于此方法。
因此,如果这些驱动程序实际上实现了这些建议的语义,那么只需将相同的字符串传入execute
或executemany
就应该重用已准备的语句,但是您可能需要检查实现(或询问实现者) )确定