2017-01-13 11 views
1

私はflask sqlalchemyを使用しています。しかし、コマンドラインでデバッグすると、私はsession.executeエラーを発見しました。MySQL用にsession.executeを使用してクエリできません

Stock ='SHELL' 
>>> db.session.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,)) 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
     File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/scoping.py", line 149, in do 
     return getattr(self.registry(), name)(*args, **kwargs) 
     File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/session.py", line 978, in execute 
     clause, params or {}) 
     File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 720, in execute 
     return meth(self, multiparams, params) 
     File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/sql/elements.py", line 317, in _execute_on_connection 
     return connection._execute_clauseelement(self, multiparams, params) 
     File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 793, in _execute_clauseelement 
     keys = distilled_params[0].keys() 
    AttributeError: 'tuple' object has no attribute 'keys' 

私はdb.engine.executeを使用していた場合、それは私がカーソルが実行使用して、のMySQLdbをインポートする場合、それはあまりにも正常に動作し、また、エラーなしで正しく

db.engine.execute("SELECT * FROM KLSE WHERE Stock LIKE %s",(Stock,)) 

に動作します。

curs.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,)) 

私が疑われる問題がsession.executeのための在庫と一致していない%sです。私はsqlalchemyドキュメントを見ていますが、理解していません。

ドキュメントから http://docs.sqlalchemy.org/en/latest/orm/session_api.html

+0

あなたの選択で余分なカンマを取り出してみましたか?WHERE Stock LIKE% (在庫)) ' - >' WHERE Stock LIKE%s '、(在庫)) ' –

+0

はい、同じエラーで動作していません – vindex

答えて

0

¶(句、paramsは=なし、マッパー=なし、バインド=なし、** KW)を実行:

フォーマットをexecuteためにSELECTを使用するため以下れる:

execute(clause, params=None, mapper=None, bind=None, **kw)

例のソリューションがあります

result = session.execute(
     "SELECT * FROM user WHERE id=:param", 
     {"param":5} 
    ) 

データベース接続がそうでない場合は適切に設定されている場合は、ドキュメント以下、次のように動作するはずです::次の選択を使用してドキュメントに

Stock ='SHELL' 
db.engine.execute(text("SELECT * FROM KLSE WHERE Stock LIKE :param"),{"param":Stock}) 

アイデアは、あなたがにクエリを与えるということです​​の有効なパラメータであるtext()関数です。そうすれば、SQLalchemy関数としてネイティブに利用できない任意のSQLを実行できます。私。 (SQLalchemy関数や他の実行可能な関数を引数として渡す必要があります。text()でパラメータを渡す必要があります)

+0

W、ありがとうございます。 '' Stock = ['SHELL'、EXXON '] 'と' placeholders ='、 '。join([':param '] * len(Stock)) 'では、' 'db.session .execute'? – vindex

+0

実際には 'db.session.execute(" SELECT * FROM KLSE WHERE Stock:param ")、{" param ":Stock})'が動作します – vindex

+0

私の答えはあなたの問題を解決しましたか?それともまだ不明なことがありましたか? –

関連する問題