在sqlalchemy中执行预处理语句
我需要对一个用户名发送4万次请求:
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 个回答
1
根据这个讨论,查看你的paster调试日志可能是个好主意,因为那里可能会有更清晰的错误信息。
3
我不太确定怎么解决你关于光标的错误信息,但我觉得准备好的语句可能解决不了你的性能问题。只要你使用的是 SQL Server 2005 或更高版本,执行计划对于 SELECT * from user WHERE login = $login
已经会被重复使用,所以使用准备好的语句不会带来性能上的提升。我对 MySql 或其他 SQL 数据库服务器不太了解,但我猜它们也有类似的优化措施,对于临时查询来说,准备好的语句可能就没必要了。
听起来性能下降的原因主要是因为你向数据库发出了 40,000 次请求。你应该尝试重写查询,只执行一次 SQL 语句,并把所有的登录名放在一起。我没记错的话,MySql 支持数组数据类型吧?如果不支持(或者你在用 Microsoft SQL),你可以考虑传入某种用分隔符分开的用户名列表。