SQLAlchemy Core - używanie tekstowego SQL

SQLAlchemy pozwala po prostu używać ciągów znaków w przypadkach, gdy SQL jest już znany i nie ma silnej potrzeby, aby instrukcja obsługiwała funkcje dynamiczne. Konstrukcja text () służy do tworzenia instrukcji tekstowej, która jest przekazywana do bazy danych w większości niezmieniona.

Konstruuje nowy TextClause, reprezentujący bezpośrednio tekstowy ciąg SQL, jak pokazano w poniższym kodzie -

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

Zalety text() zapewnia ponad zwykły ciąg to -

  • obsługa neutralna dla zaplecza dla parametrów wiązania
  • opcje wykonywania instrukcji
  • zachowanie pisania w kolumnie wynikowej

Funkcja text () wymaga parametrów Bound w nazwanym formacie dwukropka. Są spójne niezależnie od zaplecza bazy danych. Aby wysłać wartości parametrów, przekazujemy je do metody execute () jako dodatkowe argumenty.

Poniższy przykład używa parametrów powiązanych w tekstowym języku SQL -

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()

Funkcja text () konstruuje wyrażenie SQL w następujący sposób -

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

Wartości x = „A” i y = „L” są przekazywane jako parametry. Wynik to lista wierszy o nazwach od „A” do „L” -

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

Konstrukcja text () obsługuje wstępnie ustalone wartości powiązane przy użyciu metody TextClause.bindparams (). Parametry można również jawnie wpisać w następujący sposób -

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()

Możesz także użyć and_() funkcja, aby połączyć wiele warunków w klauzuli WHERE utworzonej za pomocą funkcji text ().

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()

Powyższy kod pobiera wiersze o nazwach od „A” do „L” o identyfikatorze większym niż 2. Dane wyjściowe kodu podano poniżej -

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