簡體   English   中英

在sqlalchemy中執行准備好的語句

[英]Execute a prepared statement in 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

我不明白為什么我會例外

不確定如何解決與光標相關的錯誤消息,但是我認為准備工作不會解決您的性能問題-只要您使用SQL Server 2005或更高版本, SELECT * from user WHERE login = $login的執行計划就已經可以重復使用,並且准備好的語句不會提高性能。 我不了解MySql或其他SQL數據庫服務器,但我懷疑它們對Ad-Hoc查詢也有類似的優化,使准備好的語句變得多余。

聽起來性能下降的原因更多地取決於您要進行40,000次數據庫往返的事實-您應該嘗試重寫查詢,以便僅執行一個帶有登錄名列表的SQL語句。 我認為MySql支持aray數據類型是正確的嗎? 如果沒有(或者您正在使用Microsoft SQL),則應考慮傳遞某種分隔的用戶名列表。

通過討論 ,最好檢查粘貼調試日志,以防出現更好的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM