SQLAlchemy Core - Verwenden von Textual SQL

Mit SQLAlchemy können Sie nur Zeichenfolgen verwenden, wenn SQL bereits bekannt ist und die Anweisung keine starken dynamischen Funktionen unterstützen muss. Das text () -Konstrukt wird verwendet, um eine Textanweisung zu erstellen, die größtenteils unverändert an die Datenbank übergeben wird.

Es baut ein neues auf TextClause, die eine textuelle SQL-Zeichenfolge direkt darstellt, wie im folgenden Code gezeigt -

from sqlalchemy import text
t = text("SELECT * FROM students")
result = connection.execute(t)

Die Vorteile text() bietet über eine einfache Zeichenfolge sind -

  • Backend-neutrale Unterstützung für Bindungsparameter
  • Ausführungsoptionen pro Anweisung
  • Typisierungsverhalten der Ergebnisspalte

Die Funktion text () erfordert gebundene Parameter im benannten Doppelpunktformat. Sie sind unabhängig vom Datenbank-Backend konsistent. Um Werte für die Parameter einzusenden, übergeben wir sie als zusätzliche Argumente an die Methode execute ().

Im folgenden Beispiel werden gebundene Parameter in Text-SQL verwendet.

from sqlalchemy.sql import text
s = text("select students.name, students.lastname from students where students.name between :x and :y")
conn.execute(s, x = 'A', y = 'L').fetchall()

Die Funktion text () erstellt den SQL-Ausdruck wie folgt:

select students.name, students.lastname from students where students.name between ? and ?

Die Werte von x = 'A' und y = 'L' werden als Parameter übergeben. Ergebnis ist eine Liste von Zeilen mit Namen zwischen 'A' und 'L' -

[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]

Das text () -Konstrukt unterstützt vordefinierte gebundene Werte mithilfe der TextClause.bindparams () -Methode. Die Parameter können auch explizit wie folgt eingegeben werden:

stmt = text("SELECT * FROM students WHERE students.name BETWEEN :x AND :y")

stmt = stmt.bindparams(
   bindparam("x", type_= String), 
   bindparam("y", type_= String)
)

result = conn.execute(stmt, {"x": "A", "y": "L"})

The text() function also be produces fragments of SQL within a select() object that 
accepts text() objects as an arguments. The “geometry” of the statement is provided by 
select() construct , and the textual content by text() construct. We can build a statement 
without the need to refer to any pre-established Table metadata. 

from sqlalchemy.sql import select
s = select([text("students.name, students.lastname from students")]).where(text("students.name between :x and :y"))
conn.execute(s, x = 'A', y = 'L').fetchall()

Sie können auch verwenden and_() Funktion zum Kombinieren mehrerer Bedingungen in der WHERE-Klausel, die mit Hilfe der Funktion text () erstellt wurde.

from sqlalchemy import and_
from sqlalchemy.sql import select
s = select([text("* from students")]) \
.where(
   and_(
      text("students.name between :x and :y"),
      text("students.id>2")
   )
)
conn.execute(s, x = 'A', y = 'L').fetchall()

Der obige Code ruft Zeilen mit Namen zwischen "A" und "L" mit einer ID größer als 2 ab. Die Ausgabe des Codes ist unten angegeben -

[(3, 'Komal', 'Bhandari'), (4, 'Abdul', 'Sattar')]