在sqlalchemy中执行准备好的语句

时间:2009-06-29 12:29:11

标签: python sqlalchemy

我必须针对用户名运行40K请求:

SELECT * from user WHERE login = :login

这很慢,所以我想我会用一个准备好的声明。

所以我做了

e = sqlalchemy.create_engine(...)
c = e.connect()
c.execute("PREPARE userinfo(text) AS SELECT * from user WHERE login = $1")
r = c.execute("EXECUTE userinfo('bob')")
for x in r:
    do_foo()

但我有一个:

InterfaceError: (InterfaceError) cursor already closed None None

我不明白为什么会出现异常

2 个答案:

答案 0 :(得分:2)

不确定如何解决与游标相关的错误消息,但我不认为准备好的文档会解决您的性能问题 - 只要您使用SQL Server 2005或更高版本的SELECT * from user WHERE login = $login的执行计划已经重新开始 - 使用并且准备好的声明不会带来任何性能提升。我不知道MySql或其他SQL数据库服务器,但我怀疑它们也对Ad-Hoc查询进行了类似的优化,使得预处理语句变得冗余。

听起来性能影响的原因更多的是因为你要对数据库进行40,000次往返 - 你应该尝试重写查询,这样你才能执行一个带有列表的SQL语句登录名。我是否认为MySql支持aray数据类型?如果它没有(或者您正在使用Microsoft SQL),您应该考虑传递某种分隔的用户名列表。

答案 1 :(得分:1)

this discussion开始,如果有更好的错误消息,请检查您的paster调试日志。