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')]