2017-01-13 4 views
1

Ich benutze Kolben sqlalchemy. Beim Debuggen in der Befehlszeile habe ich jedoch festgestellt, dass session.execute Fehler zurückgibt.Kann nicht mit session.execute für MySQL abfragen

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' 

Wenn ich db.engine.execute verwende, funktioniert es richtig ohne Fehler

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

Auch, wenn ich mysqldb importieren, mit Cursor ausführen, funktioniert es auch in Ordnung.

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

das Problem, das ich vermute, ist das% s ist nicht für session.execute mit Vektor entsprechen. Ich schaue durch das sqlalchemy Dokument, verstehe es aber nicht.

ausführen (Klausel, params = None, Mapper = None, bind = None, ** kw) ¶ http://docs.sqlalchemy.org/en/latest/orm/session_api.html

+0

Haben Sie versucht, das zusätzliche Komma in Ihrer Auswahl? 'WHERE Stock LIKE% s ", (Stock,))' -> 'WHERE Aktie LIKE% s", (Stock)) ' –

+0

ja, funktioniert nicht mit dem gleichen Fehler – vindex

Antwort

0

Aus der Dokumentation:

Das Format für execute SELECT mit folgendes ist:

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

Es ist ein Beispiel Lösung in der Dokumentation mit dem folgenden wählen:

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

Wenn Ihre Datenbankverbindung richtig anders eingerichtet ist, im Anschluss an die docs, sollten folgende Arbeiten:

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

Die Idee ist, dass Sie die Abfrage geben text() Funktion, die gültige Parameter für execute() ist. Auf diese Weise können Sie beliebiges SQL ausführen, das nicht nativ als SQLalchemy-Funktion verfügbar ist. I.e. Der Parameter clause nimmt eine ausführbare Anweisung (SQLalchemy-Funktion oder andere ausführbare Funktion, arbritrary Zeichenfolge muss mit text() übergeben werden und Parameter werden als Wörterbücher angegeben.

+0

W, Danke. Wie wäre es, wenn 'Stock = ['SHELL', EXXON ']' und 'placeholders =', '. Join ([': param '] * len (Stock))', wie kann ich mehrere Platzhalter in 'db.session einfügen .execute'? – vindex

+0

Eigentlich 'db.session.execute (" SELECT * FROM KLSE WHERE Stock wie: param "), {" param ": Stock})' funktioniert – vindex

+0

Also meine Antwort hat Ihr Problem gelöst? Oder war da noch etwas unklar? –