Выполнить подготовленное заявление в sqlalchemy - PullRequest
1 голос
/ 29 июня 2009

Я должен выполнить 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 ]

2 голосов
/ 29 июня 2009

Не знаю, как решить сообщение об ошибке, связанной с курсором, но я не думаю, что подготовленное заявление решит вашу проблему с производительностью - до тех пор, пока вы используете SQL Server 2005 или более позднюю версию, план выполнения для SELECT * from user WHERE login = $login уже будет использоваться повторно. и не будет никакого повышения производительности от подготовленного заявления. Я не знаю ни о MySql, ни о других серверах баз данных SQL, но подозреваю, что у них тоже есть аналогичные оптимизации для специальных запросов, которые делают подготовленный оператор избыточным.

Похоже, что причина снижения производительности связана с тем, что вы совершаете 40 000 обращений к базе данных - вам следует попытаться переписать запрос, чтобы выполнить только один оператор SQL со списком логин. Правильно ли я считаю, что MySql поддерживает тип данных aray? Если это не так (или вы используете Microsoft SQL), вам следует рассмотреть возможность передачи какого-либо списка имен пользователей с разделителями.

1 голос
/ 29 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...