Wie führt man Raw SQL in SQLAlchemy aus?
Ich habe eine Python-Web-App, die auf einer Flasche ausgeführt wird und über SQLAlchemy mit der Datenbank verbunden ist.
Ich brauche eine Möglichkeit, um das rohe SQL auszuführen. Die Abfrage umfasst mehrere Tabellenverknüpfungen zusammen mit Inline-Ansichten.
Ich habe es versucht:
connection = db.session.connection()
connection.execute( <sql here> )
Aber ich bekomme immer wieder Gateway-Fehler.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
quelle
quelle
namedtuple
unddict
direkt: initd.org/psycopg/docs/extras.html .Antworten:
Hast du es versucht:
oder:
quelle
BEGIN
undCOMMIT
selbst selbst ausgeben müssen .db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
führt es aus und legt es auch fest.SQL Alchemy-Sitzungsobjekte haben ihre eigene
execute
Methode:Alle Ihre Anwendungsabfragen sollten ein Sitzungsobjekt durchlaufen, unabhängig davon, ob es sich um unformatiertes SQL handelt oder nicht. Dadurch wird sichergestellt, dass die Abfragen ordnungsgemäß von einer Transaktion verwaltet werden , sodass mehrere Abfragen in derselben Anforderung als eine Einheit festgeschrieben oder zurückgesetzt werden können. Wenn Sie die Transaktion über die Engine oder die Verbindung verlassen , besteht ein viel höheres Risiko für subtile, möglicherweise schwer zu erkennende Fehler, die zu beschädigten Daten führen können. Jede Anforderung sollte nur einer Transaktion zugeordnet sein. Durch die Verwendung
db.session
wird sichergestellt, dass dies für Ihre Anwendung der Fall ist.Beachten Sie auch, dass dies
execute
für parametrisierte Abfragen ausgelegt ist . Verwenden Sie Parameter wie:val
im Beispiel für alle Eingaben in die Abfrage, um sich vor SQL-Injection-Angriffen zu schützen. Sie können den Wert für diese Parameter angeben, indem Sie adict
als zweites Argument übergeben, wobei jeder Schlüssel der Name des Parameters ist, wie er in der Abfrage angezeigt wird. Die genaue Syntax des Parameters selbst kann je nach Datenbank unterschiedlich sein, aber alle wichtigen relationalen Datenbanken unterstützen sie in irgendeiner Form.Angenommen, es handelt sich um eine
SELECT
Abfrage, wird eine iterierbare Anzahl vonRowProxy
Objekten zurückgegeben.Sie können mit verschiedenen Techniken auf einzelne Spalten zugreifen:
Persönlich ziehe ich es vor, die Ergebnisse in
namedtuple
s umzuwandeln :Wenn Sie die Flask-SQLAlchemy-Erweiterung nicht verwenden, können Sie dennoch problemlos eine Sitzung verwenden:
quelle
docs: SQL Expression Language Tutorial - Verwenden von Text
Beispiel:
quelle
==
?=
normalerweise für die Zuweisung eines Werts reserviert ist. während==
für den Vergleich von Werten reserviert istSie können die Ergebnisse von SELECT SQL-Abfragen mit
from_statement()
undtext()
wie hier gezeigt abrufen . Auf diese Weise müssen Sie nicht mit Tupeln umgehen. Als Beispiel für eine KlasseUser
mit dem Tabellennamenusers
können Sie Folgendes versuchen:quelle
führt das aus
<sql here>
, schreibt es jedoch nur fest, wenn Sie sich imautocommit
Modus befinden. Einfügungen und Aktualisierungen werden also nicht in der Datenbank angezeigt.Um sich nach den Änderungen zu verpflichten, tun Sie dies
quelle
Ordnen Sie zunächst Ihr Modul zu (wenn sich Ihr Modul / Ihre App im Hauptordner "manage.py" befindet und Sie sich in einem UNIX-Betriebssystem befinden), führen Sie Folgendes aus:
Führen Sie die Kolbenschale aus
Importieren Sie, was wir brauchen ::
Führen Sie Ihre Abfrage aus:
Dies verwendet die aktuelle Datenbankverbindung, die die Anwendung hat.
quelle
Haben Sie versucht,
connection.execute(text( <sql here> ), <bind params here> )
Parameter wie in den Dokumenten beschrieben zu verwenden und zu binden ? Dies kann helfen, viele Parameterformatierungs- und Leistungsprobleme zu lösen. Vielleicht ist der Gateway-Fehler eine Zeitüberschreitung? Bindungsparameter führen dazu, dass komplexe Abfragen wesentlich schneller ausgeführt werden.quelle
connection.execute(text(<sql here>), <bind params> )
.bind params
sollte NICHT in seintext()
. Eingabe der Bindeparameter in die Methode execute ()Wenn Sie Tupeln vermeiden wollen, ist eine andere Art und Weise durch den Aufruf der
first
,one
oderall
Methoden:quelle